我有這個代碼,它循環遍歷我的列表中的所有帳戶,然後對每個帳戶使用任務的帳戶做一些事情,以加速此過程。每次程序完成此操作時,我都希望用戶界面更新進度欄。我以前使用Invoke,但它不是最好的選擇,我無法得到它的工作。現在我知道這可以使用後臺工作來完成,但這不是讓應用程序多線程的最佳方式,所以我使用了這種方法。而不是援引我聽說ContinueWith,但我似乎無法得到它的工作,我沒有得到任何錯誤消息只是一個紅色的下劃線。 代碼:VB.net ContinueWith
progressBar.Value = 0
Dim tasks As New List(Of Task)()
For Each account In combos
Dim t As Task = Task.Run(Sub()
While checked = False
If proxies.Count = 0 Then
Exit Sub
'Also can't think of a good way to stop searching through accounts when there are no proxies left in my queue.
End If
Dim proxy As New WebProxy(proxies(0))
proxies.TryDequeue(0)
'Do something
End While
checkedAmount += 1
Dim progress As Integer = ((checkedAmount/combos.Count) * 100)
Task.ContinueWith(progressBar.Value = progress, TaskScheduler.FromCurrentSynchronizationContext()) 'Error here
End Sub)
tasks.Add(t)
Next
Task.WaitAll(tasks.ToArray())
我也試圖把一個子之類的東西,但鉛不了了之了。 感謝您提前提供任何幫助。與調用
更新的嘗試:
Private Delegate Sub UpdateProgressBarDelegate(ByVal progressBarUpdate As ProgressBar, ByVal value As Integer)
Dim checkedAmount As Integer = 0
Dim checked As Boolean = False
Private Sub startBtn_Click(sender As Object, e As EventArgs) Handles startBtn.Click
progressBar.Value = 0
Dim tasks As New List(Of Task)()
For Each account In combos
Dim t As Task = Task.Run(Sub()
While checked = False
proxies.TryDequeue(0)
'do stuff
End While
checkedAmount += 1
Dim progress As Integer = ((checkedAmount/combos.Count) * 100)
If Me.InvokeRequired = True Then
Me.Invoke(New UpdateProgressBarDelegate(AddressOf UpdateProgressBar), progressBar, progress)
Else
UpdateProgressBar(progressBar, progress)
End If
'Task.ContinueWith(progressBar.Value = progress, TaskScheduler.FromCurrentSynchronizationContext())
End Sub)
tasks.Add(t)
Next
Task.WaitAll(tasks.ToArray())
End Sub
Private Sub UpdateProgressBar(ByVal ProgressBarUpdate As ProgressBar, progress As Integer)
progressBar.Value = progress
End Sub
還不行不知道爲什麼?
'我以前使用Invoke,但它不是最好的選擇' - 呃,是的。這是少數幾種方法之一(或者甚至是唯一的方法),你可以實際調用UI線程。 - 另外,FYI,'Task.ContinueWith()'也需要你調用,因爲它也運行後臺任務/線程。 –
雖然調用不必那麼複雜!你可以編寫一個擴展方法來爲你做所有事情,這樣你只需要**一行**就可以調用。請參閱我的回答以獲取有關調用的更多信息,以及如何簡化它(從_ **訪問UI線程** _開始):https://stackoverflow.com/a/45571728/3740093 –
好的,我有這個現在的代碼,但它甚至不能正常工作?它不會更新,也不會在後臺運行。 – 1ben99