2

私は、カウントダウン通知イベントとキャンセル機能を備えた時間制限のために、次のパターンをさまざまな場所で使用する傾向があります。

CancellationToken ctoken = new CancellationToken();
for (int i = 0; i < 10; i++)
{
    if (ctoken.IsCancellationRequested) break;
    Thread.Sleep(1000);
    if (ctoken.IsCancellationRequested) break;
    if (Status != null) Status(this, new StatusEventArgs(i));
}

私がやりたいのは、このパターンを独自のシステムに抽象化して、カウントダウンに達するまで特定のスレッドをブロックするために使用できるようにすることです。これには、ある種のベストプラクティスがありますか?きめ細かいステータスフィードバックを提供する必要があり(できれば、毎秒、10分の1秒などに通知するように指示できます)、キャンセルをサポートする必要があります(できれば、毎秒よりも応答が良い)。CountdownEvent.NET 4.0の新機能を使用するかMonitor、単に寝る代わりに使用する必要があると思いますが、ここでより良い洞察を期待しています。

4

1 に答える 1

2

最初にすべきことは、フィードバックとキャンセルのアイデアを分離することです。つまり、フィードバックメカニズムとキャンセルメカニズムがありますが、それらはまったく関連していません。これらの2つの概念を分離できれば、処理が容易になり、パフォーマンスも向上します。

タイマーを意味するある間隔でフィードバックを提供したい。また、キャンセルが要求されているかどうかをポーリングするのではなく、待機ハンドルで待機できます。

何かのようなもの:

int i = 0;
using (System.Threading.Timer tmr = new System.Threading.Timer((s) =>
    {
        if (Status != null) Status(this, new StatusEventArgs(i));
        ++i;
    }, null, 1000, 1000))
{
    token.WaitHandle.WaitOne(TimeSpan.FromSeconds(10)));
}

CancellationToken私はあなたがどこかから取得していると仮定します(つまり、それが渡されるか、あなたがそれを定義し、他の人がその状態に影響を与える可能性があります)。

于 2011-09-05T18:59:05.470 に答える