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さん:書き込み作業はやめます
        }
    }
}