
非同期処理がこんなに楽に作れます。
これまでは BackgroundWorker を使っていましたが、
これはどうも直感的ではなかった。
Async-Await なら、分かりやすく、コードもシンプル。
サンプルを探していたら、こんな簡単な例が見つかりました。
VB.NET simpler Async Await example
上の例から関係するコードを抜粋すると、たったこれだけ。
____________________________________________________________________
Public Class Form1
' --- 時間のかかる処理(UI は変更できない)
Sub LongOperation()
Threading.Thread.Sleep(5000)
End Sub
' ---
Private Async Sub cmdAsynchronous_Click(sender As Object, e As EventArgs) Handles cmdAsynchronous.Click
lblStatus.Text = "Running a long operation asynchronously... (UI thread should be fully responsive)"
Await Task.Run(Sub()
LongOperation() ' --◀ 時間のかかる処理
End Sub)
lblStatus.Text = "Done running the long operation asynchronously."
End Sub
' ---
End Class
____________________________________________________________________
非同期で処理を実行している間はプログレスバーを表示するようにしてみました。
画面はこんな感じです。
プログラム起動時:

非同期処理を実行中:(プログレスバーが進行)

非同期処理が終わった:

コードはたったこれだけ。
____________________________________________________________________
Public Class Form1
' --- フォームロード時:プログレスバーを非表示 ----------
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ProgressBar1.Visible = False
End Sub
' --- [Async] を付けた sub --------------------
Private Async Sub cmdAsynchronous_Click(sender As Object, e As EventArgs) _
Handles cmdAsynchronous.Click
' ---
Me.lblStatus.Text = "非同期処理を実行中・・・(UI は応答する)"
Me.ProgressBar1.Visible = True
' --- LongOperation を非同期に実行
Await Task.Run(Sub()
LongOperation() ' --◀ 時間のかかる処理
End Sub)
' --- 非同期処理が終わった
Me.ProgressBar1.Visible = False
Me.lblStatus.Text = "非同期処理が終わった"
End Sub
' --- 非同期処理: 時間のかかる処理(ここでは 5秒の待ち時間)-------------
Private Sub LongOperation()
Threading.Thread.Sleep(5000)
End Sub
End Class
____________________________________________________________________
一般的な記事ではなく、おやぢチップスには不似合いかなと思ったのですが、
ま、自分のメモにもなるので投稿します。
ご参考になれば幸い・・・
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・

これまでは BackgroundWorker を使っていましたが、
これはどうも直感的ではなかった。
Async-Await なら、分かりやすく、コードもシンプル。
サンプルを探していたら、こんな簡単な例が見つかりました。
VB.NET simpler Async Await example
上の例から関係するコードを抜粋すると、たったこれだけ。
____________________________________________________________________
Public Class Form1
' --- 時間のかかる処理(UI は変更できない)
Sub LongOperation()
Threading.Thread.Sleep(5000)
End Sub
' ---
Private Async Sub cmdAsynchronous_Click(sender As Object, e As EventArgs) Handles cmdAsynchronous.Click
lblStatus.Text = "Running a long operation asynchronously... (UI thread should be fully responsive)"
Await Task.Run(Sub()
LongOperation() ' --◀ 時間のかかる処理
End Sub)
lblStatus.Text = "Done running the long operation asynchronously."
End Sub
' ---
End Class
____________________________________________________________________
非同期で処理を実行している間はプログレスバーを表示するようにしてみました。
画面はこんな感じです。
プログラム起動時:

非同期処理を実行中:(プログレスバーが進行)

非同期処理が終わった:

コードはたったこれだけ。
____________________________________________________________________
Public Class Form1
' --- フォームロード時:プログレスバーを非表示 ----------
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.ProgressBar1.Visible = False
End Sub
' --- [Async] を付けた sub --------------------
Private Async Sub cmdAsynchronous_Click(sender As Object, e As EventArgs) _
Handles cmdAsynchronous.Click
' ---
Me.lblStatus.Text = "非同期処理を実行中・・・(UI は応答する)"
Me.ProgressBar1.Visible = True
' --- LongOperation を非同期に実行
Await Task.Run(Sub()
LongOperation() ' --◀ 時間のかかる処理
End Sub)
' --- 非同期処理が終わった
Me.ProgressBar1.Visible = False
Me.lblStatus.Text = "非同期処理が終わった"
End Sub
' --- 非同期処理: 時間のかかる処理(ここでは 5秒の待ち時間)-------------
Private Sub LongOperation()
Threading.Thread.Sleep(5000)
End Sub
End Class
____________________________________________________________________
一般的な記事ではなく、おやぢチップスには不似合いかなと思ったのですが、
ま、自分のメモにもなるので投稿します。
ご参考になれば幸い・・・
ブログ記事についてのお問い合わせは「質疑応答 掲示板」で・・・
ここをクリックして、北窓舎のサイトにもお立ち寄りください・・・

ってことを言ってます。
記事のトピックが非同期処理なので、プログレスバーについては説明しておりませんでした。
これからは、もう少し親切な記事が書けるよう努力してみます。