1

X 秒以内にタスクを完了する必要があり、それが完了しない場合は、続行して残りのタスクを処理したい場合がよくあります。

私は次のようなものにデフォルト設定しています:

Thread worker = new Thread(() => {
    // do some long operation
});

Thread monitor = new Thread(() => {
    Thread.Sleep(10000);
    if(worker != null && worker.IsAlive) {
        worker.Abort();
        worker = null;
    }
    StartNextTask();
});

monitor.Start ();
worker.Start();

これは機能しますが、2 つのスレッドを使用するため面倒です (はい、Taskクラスを使用してスレッドプールのスレッドを使用することもできます)。

AutoResetEvent前者はワーカーが完了するまでモニタースレッドをブロックし、駆動型アプローチはクライアントがイベントを呼び出してモニターに通知することに依存しているため、とeventベースモデルは完全には機能しません。event

同じセマンティクスに従うことができるこれに代わるパターンはありますか?

4

1 に答える 1

2

あなたが言うように Task クラスを使用する場合、まさにあなたが望むことを行う Task.Wait() を使用することもできます。待機する秒数を指定します。CancellationToken を使用してキャンセルしない限り、タスクはキャンセルされません。

参照: http://msdn.microsoft.com/en-us/library/dd235606.aspx

于 2012-12-11T16:00:00.613 に答える