我的 C# 应用程序是这样的,即使用后台工作程序来等待对某些传输数据的确认。这是一些伪代码,演示了我正在尝试做的事情:
UI_thread
{
TransmitData()
{
// load data for tx
// fire off TX background worker
}
RxSerialData()
{
// if received data is ack, set ack received flag
}
}
TX_thread
{
// transmit data
// set ack wait timeout
// fire off ACK background worker
// wait for ACK background worker to complete
// evaluate status of ACK background worker as completed, failed, etc.
}
ACK_thread
{
// wait for ack received flag to be set
}
发生的情况是 ACK BackgroundWorker 超时,并且从未收到确认。我相当肯定它是由远程设备传输的,因为该设备根本没有改变,而 C# 应用程序正在传输。我已经从这里更改了 ack 线程(当它工作时)......
for( i = 0; (i < waitTimeoutVar) && (!bAckRxd); i++ )
{
System.Threading.Thread.Sleep(1);
}
……到这……
DateTime dtThen = DateTime.Now();
DateTime dtNow;
TimeSpan stTime;
do
{
dtNow = DateTime.Now();
stTime = dtNow - dtThen;
}
while ( (stTime.TotalMilliseconds < waitTimeoutVar) && (!bAckRxd) );
与前者相比,后者产生非常准确的等待时间。但是,我想知道删除睡眠功能是否会干扰接收串行数据的能力。C#是否一次只允许一个线程运行,也就是说,我是否必须在某个时间让线程休眠以允许其他线程运行?
您可能有的任何想法或建议将不胜感激。我正在使用 Microsoft Visual C# 2008 Express Edition。谢谢。