skip to Main Content

Delay until await returns a True

I have looked at many examples of Delaying a for while loop until a result is gained; but can’t come up with a solution that will not hang the system forever if the boolean variable is not attained.

I have used Thread.Sleep but it stops the await thread from returning a result. I need someone to assist me in finding a solution where the system will wait for the "LoadedShopifyProduct" to be true then continue with the "Button1.click".

*** You will see that the try variable stops once 40 is reached so I really don’t know whether the products have been loaded. Is there a better option then Thread.Sleep?

Private Sub TEST
            Show()
            TopMost = True
            Dim HasInternet As Boolean = crm.HaveInternetConnection() :'check if there is internet
            If HasInternet = False Then
                Me.Close()
                Exit sub
            End If
            Form1.LoadShopifyProducts():'calls the Async routine
            Dim trys As Short = 0
            While LoadedShopifyProducts = False And HasInternet = True And trys < 40
                Form1.ToolStripStatusLabel1.Text = "Tries : " & trys & " -> Shopify Products Not loaded ! Please wait a few seconds"
                Application.DoEvents()
                Thread.Sleep(2000)
                trys = trys + 1
            End While
            Button1.PerformClick() : 'do next 
End Sub
Public Async Sub LoadShopifyProducts()        
        Dim HasInternet As Boolean = crm.HaveInternetConnection()
        If HasInternet = True Then
            TimesShopifyLoad = TimesShopifyLoad + 1
            
            Dim BaseURL = Para(Val(TermNumber), 580)
            Dim Key = Para(Val(TermNumber), 581)

            Dim shopifyClient As New ShopifyApi(BaseURL, Key)
            shopifyClient.Initialise()

            'retrieve all Products from Shopify API
            allShopifyProducts = Await shopifyClient.GetAllProducts()
            'also collate a master list of all Variants from the list of Products returned above to allow searching by SKU which only appears on the variant
            allShopifyVariants = Await shopifyClient.GetAllVariants(allShopifyProducts)
           
           LoadedShopifyProducts = True :' after await set ---> to true ! ! 
            CountShopify = allShopifyVariants.Count
        
            ToolStripStatusLabel1.Text = "( Shopify : " & allShopifyVariants.Count & " ) Times:" & Str(TimesShopifyLoad)
        End If
End Sub

2

Answers


  1. Here’s how you would do the basic version of what you want:

    Private Async Sub Button1_Click(sender As Object, args As EventArgs)
        If crm.HaveInternetConnection() Then
            Dim variants = Await GetShopifyProducts(Para(Val(TermNumber), 580), Para(Val(TermNumber), 581))
            ' Do something with the variants
        End If
    End Sub
    
    Private Async Function GetShopifyProducts(BaseURL As String, Key As String) As Task(Of ShopifyVariant())
        Dim shopifyClient As New ShopifyApi(BaseURL, Key)
        shopifyClient.Initialise()
        Dim products = Await shopifyClient.GetAllProducts()
        Dim variants = Await shopifyClient.GetAllVariants(products)
        Return variants
    End Function
    

    If you needed to repeat the call every 2 seconds until a condition is met, then it looks like this:

    Private Async Sub Button1_Click(sender As Object, args As EventArgs)
        Me.Timer1.Interval = 2000
        Me.Timer1.Enabled = True
    End Sub
    
    Private Async Sub Timer1_Tick(sender As Object, args As EventArgs)
        If crm.HaveInternetConnection() Then
            Dim variants = Await GetShopifyProducts(Para(Val(TermNumber), 580), Para(Val(TermNumber), 581))
            ' Do something with the variants
            If TurnOffTimerCondition Then
                Me.Timer1.Enabled = False
            End If
        End If
    End Sub
    
    Private Async Function GetShopifyProducts(BaseURL As String, Key As String) As Task(Of ShopifyVariant())
        Dim shopifyClient As New ShopifyApi(BaseURL, Key)
        shopifyClient.Initialise()
        Dim products = Await shopifyClient.GetAllProducts()
        Dim variants = Await shopifyClient.GetAllVariants(products)
        Return variants
    End Function
    

    Update with example timeout:

    Private Async Sub Button1_Click(sender As Object, args As EventArgs)
        If Me.Timer1.Enabled = False Then
            Me.Timer1.Interval = 2000
            Me.Timer1.Enabled = True
            sw = Stopwatch.StartNew()
        End If
    End Sub
    
    Private Async Sub Timer1_Tick(sender As Object, args As EventArgs)
        If crm.HaveInternetConnection() Then
            Dim variants = Await GetShopifyProducts(Para(Val(TermNumber), 580), Para(Val(TermNumber), 581))
            ' Do something with the variants
            If sw.Elapsed > TimeSpan.FromSeconds(60) Then
                Me.Timer1.Enabled = False
                MessageBox.Show("not met in 60 seconds")
            End If
        End If
    End Sub
    
    Login or Signup to reply.
  2. You can use a background worker and call you function from background workers do work at an event. by using a background worker you can prevent the system from hangup and also can show some progress bars before calling the background worker and hiding on completion.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search