私は単純な非同期ボタンと非同期/待機機能を持っています。私のボタンをクリックすると、UIがフリーズします。誰かが私が間違っていることを私に説明することができますか?ブロック非同期/待機ボタンUIブロック
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
LabelCounter.Text = "Running"
LabelCounter.Text = await ComputeText()
End Sub
と、この機能:
Private Async Function ComputeText() As Task(Of String)
Dim result as string = Await Task.Run(Function()
'Thread.Sleep(2000)
Dim i as Integer = 0
While i <> 100000
i += 1
'block as other staff can access it as well from outside
SyncLock thisLock
LabelCounter.Invoke(Sub()
LabelCounter.Text = i
End Sub)
End SyncLock
End While
Return "Done"
End Function)
Return result
End Function
あなたは 'Invoke'を使用しています。これは同期呼び出しです。 – Aybe
まあ、 'Invoke'を何十回も呼び出すのは、おそらくパフォーマンスにとって最善のものではないでしょう。 –
@Glorinああ、なぜそのフリーズUI UI(didntはInvokeが同期であるか知っている)です。しかし、まず、私はこのラベルを更新する必要があります - 私はInvokeを使用する必要があります(私は異なるスレッド上にあるので、私はまた、私はまた、ラベルを更新している他のタスクがあるのでSyncLockを作る必要があります。これは正しいですか?実装する方法は他にありますか? –