2015-12-21 32 views
0

我的應用程序使用其SDK發送請求到另一個應用程序。根據請求的大小,我的應用收到響應可能需要一段時間。如果我在UI線程中發送請求,它只是在那裏等待響應,使我的應用程序看起來沒有響應。因此,我想將請求移至BackgroundWorker,並在單獨的窗體上顯示選框樣式的ProgressBar,以用於報告正在完成的工作狀態,直至收到響應。在不使用RunWorkerCompleted事件的情況下檢查BackgroundWorker的狀態

但是使用RunWorkerCompleted事件並不可行,因爲我的應用程序根據請求的內容對收到的響應執行了許多不同的操作。

在UI線程中調用BackgroundWorker.RunWorkerAsync方法之後,我嘗試了使用Application.DoEvents的「While BackgroundWorker.IsBusy」循環,但這凍結了選框ProgressBar的動畫,因爲它一直循環直到BackgroundWorker完成。如果我在等待時讓UI線程進入睡眠狀態,這也會凍結選取框動畫。

是否有任何方法檢查BackgroundWorker的狀態,而不佔用UI線程或將其置於睡眠狀態?如果沒有,是否還有其他建議的方法顯示應用程序在等待來自其他應用程序的響應時仍在工作?我曾經在狀態表單上播放動畫,但VB.Net 2013中不再有動畫控制。

在此先感謝!

+1

'yourWorker.ReportProgress(...)'和'yourWorker.ProgresChanged + = SomeMethod'? https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=vs.110).aspx – TyCobb

回答

0

代替單個BackgroundWorker具有固定的事件處理程序,就可以在代碼中的每個請求/響應類型建立不同的情況下,是這樣的:

Dim worker = New BackgroundWorker() 
AddHandler worker.DoWork, 
    Sub(sender As Object, args As DoWorkEventArgs) 
     ' Do something here 
     args.Result = sdk.DoSomething() 
    End Sub 
' Also handle ProgressChanged here if you need 
AddHandler worker.RunWorkerCompleted, 
    Sub(sender As Object, args As RunWorkerCompletedEventArgs) 
     If args.Cancelled Then 
      ' User cancelled (if supported) 
     ElseIf args.Error IsNot Nothing Then 
      ' An exception was thrown 
     Else 
      Dim result = DirectCast(args.Result, TheResultType) 
      ' Do something with the result 
     End If 
     ' Hide progress bar here 
    End Sub 
' Show progress bar here 
worker.RunWorkerAsync() 

備選地,可以使用Async/Await,是這樣的:

Public Async Function DoSomething() As Task 
    ' Show progress bar here 
    Dim result = Await Task.Run(
     Function() 
      Return sdk.DoSomething() 
     End Function 
    ) 
    ' Do something with the result 
    ' Hide progress bar here 
End Function 

如果SDK支持異步,這樣會更好。

+0

謝謝,馬克,我沒有意識到異步/等待功能。我會研究一下。但是,如果我使用Await Task.Run(大概是將我的請求發送給其他應用程序),是不是會凍結選框ProgressBar? –

+0

@LarryStinson'Task.Run'將在後臺線程中運行該函數。 DoSomething方法將等待任務完成,但其他應用程序將繼續運行。 [docs](https://msdn.microsoft.com/en-us/library/hh191443.aspx)解釋了所有背後的「魔術」。 Async/Await最適合自然的異步活動(例如I/O),但可以在釋放GUI應用程序中的UI線程時使用。 – Mark

相關問題