我在C#中有以下代码:
if (flag)
{
SendDataToExternalDevice();
System.Threading.Thread.Sleep(delayValue);
}
SendMoreDataToExternalDevice();
在 SendMoreDataToExternalDevice()之前, SendDataToExternalDevice()执行 delayValue 毫秒是非常重要的。但似乎在运行时程序首先等待 delayValue 毫秒,然后在 SendMoreDataToExternalDevice()之前运行 SendDataToExternalDevice()。为什么是这样?我该如何解决这个问题?
PS。等待时间不必精确到毫秒(大约一秒左右就可以了),但我不希望这两个函数一个接一个地运行。
更多信息: 我将代码修改为:
if (flag)
{
for (int i=0; i<2; i++)
{
SendDataToExternalDevice();
System.Threading.Thread.Sleep(1000);
}
}
SendMoreDataToExternalDevice();
新代码的结果如下:
第一次调用SendDataToExternalDevice()
等待1秒
第二次调用SendDataToExternalDevice()
等待1秒
SendMoreDataToExternalDevice()调用
所以这似乎工作得很好。但是当我使用2秒的 delayValue 运行原始代码时,它会这样做:
等待2秒
SendDataToExternalDevice()
SendMoreDataToExternalDevice()
答案 0 :(得分:1)
我想建议一种不同的工作流模式。
AutoResetEvent _waitHandle = new AutoResetEvent(true);
public void SendDataToExternalDevice()
{
// do some work;
// release the lock.
_waitHandle.Set();
// may be some more work to do
}
public void SendMoreDataToExternalDevice()
{
_waitHandle.WaitOne();
// maye be wait addtional time here ?
// do send data;
}
以下是处理处理的方式
if (flag)
{
SendDataToExternalDevice();
}
SendMoreDataToExternalDevice();
答案 1 :(得分:0)
我不确定为什么你的代码会以它的方式工作(听起来很奇怪,但是Thread.Sleep
是一个复杂的野兽),如果没有看到更多的解决方案,可能无法找到它。
与此同时,你能做点什么:
int delay = 0;
if (flag)
{
SendDataToExternalDevice();
delay = delayValue;
}
var timer = new System.Threading.Timer(_ => SendMoreDataToExternalDevice()
,null
,delay
,Timeout.Infinite);
至少要测试它是否有效?
答案 2 :(得分:-1)
您可以尝试按如下方式使用完整内存屏障,以避免编译器优化:
if (flag)
{
Thread.MemoryBarrier();
SendDataToExternalDevice();
Thread.MemoryBarrier();
System.Threading.Thread.Sleep(delayValue);
}
SendMoreDataToExternalDevice();
但感觉就像某个地方你的解决方案存在设计缺陷。