申し訳ありませんが、私は困惑しています。私たちにはハードウェアにコマンドを送信するプロセスがあり、それは圧倒されます。私は、100回の送信ごとに、処理を続ける前に1秒間休止する簡単な解決策を作成しました。デバッグモードで実行すると、これは私たちが経験していたすべての問題を完全に解決しました。しかし、私はこのソリューションをリリースビルドにコンパイルすると、私のタイマーメソッドは一見永遠に回転を停止するようになります。リリースビルドはデバッグビルドとは異なる動作をします
次のコードでは、シンプルなwhileループを使用していますが、これはブールが真になるまでループします。 (私は、スレッドが応答しなくなってきてほしくないので、私は、睡眠を使いたくありませんでした)
foreach (DataRow row in ds.Tables[0].Rows)
{
string Badge = Database.GetString(row, "Badge");
if (Badge.Length > 0)
{
if(Count < Controller.MaximumBadges)
{
if (processed == 100) // Every 100 downloads, pause for a second
{
processed = 0;
StartTimer();
while (!isWaitOver)
{
}
Controller.PostRecordsDownloadedOf("Badges", Count);
}
if (Download(Badge, false))
{
Count++;
processed++;
}
}
else
Discarded++;
}
TotalCount++;
}
private void StartTimer()
{
// Create a timer with a one second interval.
aTimer = new System.Timers.Timer(1000);
// Hook up the Elapsed event for the timer.
aTimer.Elapsed += OnTimedEvent;
aTimer.AutoReset = true;
aTimer.Enabled = true;
isWaitOver = false;
}
private void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
isWaitOver = true;
aTimer.Enabled = false;
}
誰もがリリースモードで実行しているときにwhileループが無限に貼り付けてしまう理由を見ることができますか?また、誰かがこれに対するより良い解決策を見たら、私に教えてください。私はVS 2010を使用する必要があります。
読んでいただきありがとうございます。
「isWaitOver」を作成します。 https://msdn.microsoft.com/en-us/library/x13ttww7.aspx – flakes
宣言は表示されませんが、このコードが信頼できるものであるためには、isWaitOverはvolatileでなければなりません。それは...ですか? –
Thread.Sleepはループとしてです – NtFreX