async/awaitによる非同期処理の無限ループの書き方について
Visual C#にて、現在あるWindows formアプリを作っています。
チェックボックスにチェックを入れると、その間はずっと裏で別の作業をしていて欲しいです。
その際UIはかたまらないようにしたいと思い、非同期処理で作ることにしました。
下記が自分が現在考えているコーディングなのですが、async/awaitを使った無限ループの非同期処理はこんな感じであっていますかね。
つたない文章で申し訳ありませんが、どなたかご指摘お願いします。
private async void 仕事1_CheckedChange(object sender, EventArgs e)
{
if ( 仕事1.Checked ) // Aさん:もしチェックされたら
{
try // Aさん:Bさんこれやってみて
{
await Task.Run( async( ) => 仕事1( ) ) ; // Aさん:Bさんに仕事1やってもらう。それまで他の仕事しとくね、問題起きたら報告頂戴
}
catch ( Exception ex ) // Aさん:問題起きてるかチェックするよ
{
仕事1.Checked = false ; // Aさん:問題が起きたからチェック外しとくね
AddLog( ex + "\r\n" , Color.Blue ) ; // Aさん:起きた問題はログブックに書き込んどくよ
}
}
}
private async Task 仕事1( )
{
while ( 仕事1.Checked ) // Bさん:もしチェックされてたら、されてる間はずっと
{
書き込み作業( pid , addr , ofst ) ; // Bさん:書き込み作業します
await Task.Delay( 150 ).ConfigureAwait( false ) ; // Bさん:0.15秒次の作業遅れます。遅れてもAさんには支障ないです
}
書き込み作業終了( pid , addr , ofst ) ; // Bさん:チェックが解除されたから書き込み作業終了します
}
早くにご回答感謝します...。
別スレッドからUI側の条件を持ってきたい、となるとこうすればよろしいのでしょうか。
var tokenSource = new CancellationTokenSource( ) ; // Aさん:仕事1をやめる時の条件を作っておくよ
var token = tokenSource.Token ; // Aさん:その条件はこれね
private async void 仕事1_CheckedChange(object sender, EventArgs e)
{
if ( 仕事1.Checked ) // Aさん:もしチェックされたら
{
try // Aさん:Bさんこれやってみて
{
await Task.Run( async( ) => 仕事1( token ) , token ) ; // Aさん:Bさんに仕事1やってもらう。それまで他の仕事しとくね、問題起きたら報告頂戴
}
catch ( Exception ex ) // Aさん:問題起きてるかチェックするよ
{
仕事1.Checked = false ; // Aさん:問題が起きたからチェック外しとくね
AddLog( ex + "\r\n" , Color.Blue ) ; // Aさん:起きた問題はログブックに書き込んどくよ
}
}
else // Aさん:もしチェックが外れたら
{
tokenSource.Cancel( ) ; // Aさん:仕事1はやめてもらうよ
}
}
private async Task 仕事1( CancellationToken token )
{
while ( true ) // Bさん:Aさんから仕事中止の命令がこない間はずっと
{
書き込み作業( pid , addr , ofst ) ; // Bさん:書き込み作業します
await Task.Delay( 150 ).ConfigureAwait( false ) ; // Bさん:0.15秒次の作業遅れます。遅れてもAさんには支障ないです
if ( token.IsCancellationRequested ) // Bさん:Aさんから仕事中止の命令がきたら
{
書き込み作業終了( pid , addr , ofst ) ; // Bさん:チェックが解除されたから書き込み作業終了します
break ; // Bさん:書き込み作業はやめます
}
}
}