私はvb.netウィンドウフォームアプリケーションに取り組んでいます。ここにいくつかの.gif画像があるメインウィンドウがあります。これらの画像は、データベースからの値に従ってアニメーション化されます。画像をクリックすると、ポップアップウィンドウが開きます。このポップアップウィンドウには、6つのボタンがあります。ボタンのいずれかをクリックすると、SQL Serverデータベーステーブルのそれぞれの値が1に更新され、1秒後に同じ値が0に更新されます。このために次のコードを使用しました
Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
Try
If (Label1.Text.Contains("Drag")) Then
tag2 = "D" + Label1.Text.Substring((Len(Label1.Text.ToString()) - 1), 1)
Else
tag2 = Label1.Text.Trim().ToString()
End If
ObjTags.Name = tag2 + ".Start"
btnStart.Enabled = False
ObjTags.DigitalValue = 1
i = ObjTags.UpdateConValue(6)
Application.DoEvents()
Thread.Sleep(1000)
ObjTags.DigitalValue = 0
i = ObjTags.UpdateConValue(6)
btnStart.Enabled = True
Catch ex As Exception
End Try
End Sub
これはうまく機能しています。ボタンをクリックすると、データベースのそれぞれの値が1に更新され、1秒後に0に更新されます。ただし、この操作中は、メインページの.gif画像のアニメーションが停止します。これを解決する方法は?
Thread.Sleep(1000)
UIスレッドを呼び出すと、UIスレッドにスリープするように命令しているため、その間UIは更新されません。また、UIスレッドでデータベースを更新しようとすると、UIスレッドがビジーになり、その間UIの更新は行われません。
非同期/待機
スレッドを使用するか、データベースを更新して遅延を適用するために非同期/待機に切り替えることをお勧めします。
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Await UpdateDatabase()
Await Task.Delay(1000)
UpdateUI()
End Sub
Private Async Function UpdateDatabase() as Task
'Do time-consuming task here
End Function
Private sub UpdateUI()
'Update UI here
End sub
糸
.NET 4.0を使用しているため、次のようなスレッドを使用する必要があります。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ts = New Threading.ThreadStart(Sub()
UpdateDatabase()
Threading.Thread.Sleep(1000)
Me.Invoke(Sub()
UpdateUI()
End Sub)
End Sub)
Dim t = New Threading.Thread(ts)
t.Start()
End Sub
Private Sub UpdateDatabase()
'Do time-consuming task here
End Sub
Private sub UpdateUI()
'Update UI here
End sub
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加