我正在使用SemaphoreLite来确保将所有触发和错误的事件写入特殊文件。问题是后台线程在写入完成之前调用close,并且由于信号量在一瞬间说它为空,它处理信号量导致写入不完整。
这是我的代码:
private void waitForWriterErrorEventsToFire()
{
//TODO: Figure out a way to avoid race conditions
if (_notProcessedCount == null)
{
return;
};
while (_notProcessedCount.CurrentCount != int.MaxValue)
{
Thread.Sleep(10);
}
Thread.Sleep(500);
if (_notProcessedCount.CurrentCount != int.MaxValue)
{
waitForWriterErrorEventsToFire();
}
_notProcessedCount.Dispose();
_notProcessedCount = null;
}
Thread.Sleep(500)解决了大部分问题,但这不是正确的做法。我知道竞争条件发生在while循环条件下,Current count返回int.MaxValue,但如果你在sleep之后再次检查它,它现在小于int.MaxValue。关于如何避免竞争条件的任何建议?
我正在考虑编写一些可以检查设定时间的内容,如果条件仍然存在则会在该通过之后进行处理。