我試圖控制一塊測試設備,並且我需要確定如何與其進行通信的順序正確。爲什麼這個線程永無止境?
首先我打電話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