3

長時間実行されるwinforms appタスクと 2 つのボタンがあります。ワンボタンスタートとワンストップ。

開始ボタンを押すと、キャンセルトークンを持つ新しいタスクが開始されます。Stop ボタンを押すと、キャンセル トークンの Cancel メソッドが呼び出されます。

UI を常に使用できるようにしたいので、このジョブの try と catch ブロックをどこに配置しますか。私が見たすべての例で、t.Wait(); の周りに配置しました。

しかし、それを行うとUIがフリーズします。それが、最初にタスクを使用した理由であり、タスクを実行しながらUIを使用し続けます。では、Task.Wait を使用せずに try catch ブロックをどこに置くか。

スタートボタン:

 tokenSource2 = new CancellationTokenSource();
   ct = tokenSource2.Token;
   t = new Task(doStart, ct);
   t.Start();

停止ボタン:

tokenSource2.Cancel();
4

1 に答える 1

2

doStart を更新してキャンセル イベントを処理し、正常にタスクを終了することができるので、Wait をまったく使用する必要はありません。

public void doStart(CancellationToken token)
{
    while(...)
    {
        ...
        if (token.IsCancellationRequested)
            break;
    }
}

または、別のスレッドでタスクの結果を待つこともできます。

Thread.QueueUserWorkItem((state) =>
{
    try
    {
        t.Wait();
    }
    catch(...)
    {
        ...
    }
});
于 2012-12-27T20:20:20.973 に答える