Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么';这条线永远不会结束吗?_C#_Multithreading_Sequence - Fatal编程技术网

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()
函数。现在很有魅力。