私はいくつかのタイムアウト期間が満了しているかどうかをチェックする方法があり、それが持っている場合は、開始時間をリセットし、trueを返します:タイムアウトを原子的にチェックしてリセットするにはどうすればよいですか?
bool CheckAndResetTimeout() {
if (DateTime.UtcNow > _start + _timeout) {
_start = DateTime.UtcNow;
return true;
}
return false;
}
私はもし2つのスレッドがヒットするという意味で、このスレッドを安全にするにはどうすればよいですそれは同時に、一度だけ真実を返すことが保証されていますか?私はこれがダブルチェックロッキングによって達成できると思いますが、私はBCL(これはおそらくSystem.Threading
の下にあります)の中で、より高いレベルの抽象化を提供するものを見つけることを望んでいました。私は、可能な場合、そのようなSysetm.Threading.Interlocked
から軽量構造物を構成することなどによって、lock
を避けることを望んだが、私は持っていない
static object TimerLock = new object();
static bool CheckAndResetTimeout()
{
lock (TimerLock)
{
if (DateTime.UtcNow > _start + _timeout)
{
_start = DateTime.UtcNow;
return true;
}
return false;
}
}
https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/lock-statement
なぜ実際のタイマーを使用しないのですか?それはあなたのために内部的にこれを扱うでしょう - あなたはインターバルが経過するときにコールバックを得るでしょう。 – xxbbcc
https://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx – xxbbcc
私はそれが怠け者になりたいので。タイムアウトが切れた場合、それを呼び出すことは何らかの作業を行う責任があり、その作業をより頻繁に行う必要はありません。 –