为什么不';这根线永远不会断

本文关键字:永远 为什么不 | 更新日期: 2023-09-27 18:12:56

我正试图控制一台测试设备,我需要正确确定与它通信的顺序。

首先我调用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;
}

为什么不';这根线永远不会断

与其再次调用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() do.

很可能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();
}