私のプロジェクト (C#、VS2010、.NET 4.0) では、特定のfor
ループを 200 ミリ秒以内に終了する必要があります。そうでない場合は、残りの反復を実行せずに、この期間の後に終了する必要があります。ループは通常i = 0
、約 500,000 から 700,000 になるため、合計ループ時間は異なります。
同様の次の質問を読みましたが、私の場合は役に立ちませんでした:
これまでのところ、Stopwatch
オブジェクトを使用して経過時間を追跡しようとしましたが、うまくいきません。これまでに試した2つの異なる方法を次に示します。
方法 1.for
ループ内の経過時間の比較:
Stopwatch sw = new Stopwatch();
sw.Start();
for (i = 0; i < nEntries; i++) // nEntries is typically more than 500,000
{
// Do some stuff
...
...
...
if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
break;
}
sw.Stop();
if (sw.Elapsed > TimeSpan.FromMilliseconds(200))
完了するまでに 200 ミリ秒以上かかるため、これは機能しません。したがって、私の場合は役に立たない。TimeSpan.FromMilliseconds()
一般的にこれほど時間がかかるのか、それとも何らかの理由で私の場合だけなのかはわかりません 。
方法 2.時間を比較する別のスレッドを作成する:
Stopwatch sw = new Stopwatch();
sw.Start();
bool bDoExit = false;
int msLimit = 200;
System.Threading.ThreadPool.QueueUserWorkItem((x) =>
{
while (bDoExit == false)
{
if (sw.Elapsed.Milliseconds > msLimit)
{
bDoExit = true;
sw.Stop();
}
System.Threading.Thread.Sleep(10);
}
});
for (i = 0; i < nEntries; i++) // nEntries is typically more than 500,000
{
// Do some stuff
...
...
...
if (bDoExit == true)
break;
}
sw.Stop();
for ループには、いくつかの統計を出力する他のコードがあります。方法 2 の場合、for
すべての反復が完了する前にループが確実に中断されますが、ループのタイミングは依然として 280 ~ 300 ミリ秒です。
厳密に 200 ミリ秒以内に for ループを中断するための提案はありますか? ありがとう。