C# 为什么';这条线永远不会结束吗?
我正试图控制一台测试设备,我需要获得正确的通信顺序 首先我调用C# 为什么';这条线永远不会结束吗?,c#,multithreading,sequence,C#,Multithreading,Sequence,我正试图控制一台测试设备,我需要获得正确的通信顺序 首先我调用StartGettingTraceData()。然后在将来的某个时候,我调用StopGettingTraceData()尝试结束GetTraceData()函数,而不是重新启动它本身。但这永远不会发生。事实上,我从来没有到过DoneTraces.Set()这行booltimedout=!WaitOne(10000),timedOut始终为真 private static AutoResetEvent DoneTraces = new
StartGettingTraceData()
。然后在将来的某个时候,我调用StopGettingTraceData()
尝试结束GetTraceData()
函数,而不是重新启动它本身。但这永远不会发生。事实上,我从来没有到过DoneTraces.Set()
这行booltimedout=!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;
}
很可能,
ReadData
调用被阻塞了。顺便说一句,所有这些递归线程都让你自己很难受。。。你不能只用一个环吗
private void GetTraceData()
{
byte[] receivedbytes = new byte[1];
while( RunTraceQueryWorker )
{
if( Connection.ReadData(receivedbytes) && receivedbytes[0] == 192 )
{
ProcessIncomingTrace();
}
Sleep(100);
}
Thread.Sleep(200);
DoneTraces.Set();
}
与其反复调用GetTraceData,不如使用while循环查看您的情况,如下所示:
private static AutoResetEvent DoneTraces = new AutoResetEvent(false);
private void GetTraceData()
{
do
{
byte[] receivedbytes = new byte[1];
if (Connection.ReadData(receivedbytes) && receivedbytes[0] == 192)
ProcessIncomingTrace();
Thread.Sleep(100);
}
while (RunTraceQueryWorker)
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;
}
如果不了解
ReadData
&ProcessIncomingTrace()
的功能,就不可能知道代码冻结的具体原因。线程非常昂贵,因此不应该递归创建它们。有这么多线程(执行Sleep()
)可能也是您无法停止的问题。您是否尝试过使用DataReceived事件处理程序?我昨晚看了手册,除了可能的不同反应外,它看起来很直接。你是对的。当我注释掉这两行代码时,一切正常。我肯定还有其他问题。如果在ReadData()调用中放置断点,您是否看到它返回?我决定使用与您非常类似的代码(do while循环)。一定要解决我的问题,我必须执行ProcessIncomingTrace()
函数。现在很有魅力。