我试图控制一块测试设备,并且我需要确定如何与其进行通信的顺序正确。为什么这个线程永无止境?
首先我打电话StartGettingTraceData()
。然后在将来的某个时间,我会呼叫StopGettingTraceData()
尝试结束GetTraceData()
函数,而不是重新启动它自己。但是,永远不会发生。其实我从来没有去过线DoneTraces.Set()
所以就行bool timedOut = !DoneTraces.WaitOne(10000)
,timedOut
总是如此;
private static AutoResetEvent DoneTraces = new AutoResetEvent(false);
private void GetTraceData()
{
byte[] receivedbytes = new byte[1];
if (Connection.ReadData(receivedbytes) && receivedbytes[0] == 192)
ProcessIncomingTrace();
Thread.Sleep(100);
if (RunTraceQueryWorker)
new Thread(GetTraceData).Start();
else
{
Thread.Sleep(200);
DoneTraces.Set();
}
}
private void StartGettingTraceData()
{
RunTraceQueryWorker = true;
new Thread(GetTraceData).Start();
}
private bool StopGettingTraceData()
{
RunTraceQueryWorker = false;
bool timedOut = !DoneTraces.WaitOne(10000);
return timedOut;
}
对发生了什么有什么想法?
编辑:
这是我Connection.ReadData(...)函数。顺便说一句,这是一个串行连接。
public bool ReadData(byte[] responseBytes)
{
int bytesExpected = responseBytes.Length, offset = 0, bytesRead;
while (bytesExpected > 0 && (bytesRead = MySerialPort.Read(responseBytes, offset, bytesExpected)) > 0)
{
offset += bytesRead;
bytesExpected -= bytesRead;
}
return bytesExpected == 0;
}
线程很贵,所以你不应该递归地创建它们。有这么多的线程(做'睡眠()')可能也是你不停的问题。 – 2013-05-09 14:46:46
您是否尝试过使用DataReceived事件处理程序?我昨天看了这本手册,看起来非常直截了当,除了可能的不同反应之外。 – dbasnett 2013-05-09 15:05:20