カウントダウン通知によるスレッドの遅延のベストプラクティス
-
26-10-2019 - |
質問
私は、カウントダウン通知イベントとキャンセルする機能を備えたタイミング遅延のために、次のパターンを使用する傾向があります。
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));
}
私がやりたいことは、このパターンを独自のシステムに抽象化することです。カウントダウンに到達するまで特定のスレッドをブロックするために使用できます。これにはある種のベストプラクティスはありますか?粒状ステータスフィードバックを提供する必要があります(できれば、1秒ごと、10分の1秒などに通知するように指示することができます)。キャンセルをサポートする必要があります(できれば各秒よりも優れた応答があります)。私は新しいものを使うべきだと感じています CountdownEvent
.NET 4.0の機能、またはaを使用する可能性があります Monitor
ただ寝るのではなく、ここでより良い洞察を望んでいます。
解決
最初にすべきことは、フィードバックとキャンセルのアイデアを分離することです。つまり、フィードバックメカニズムとキャンセルメカニズムがありますが、それらはまったく関連していません。これらの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
どこか他の場所から(つまり、それは渡されます、またはあなたはそれを定義し、他の人がその状態に影響を与える可能性があります)。
所属していません StackOverflow