使用委托宣布数据时,C#线程未关闭(似乎崩溃)

时间:2016-09-10 12:07:39

标签: c# multithreading visual-studio-2015 .net-4.5

所以我遇到了一个奇怪的情况。我已成功使用模式一段时间来在2个线程之间传递数据。假设有2个主题:

线程A(GUI线程) 线程B(在后台轮询设备中的数据)

线程B正在执行PollStatus函数,然后将线程休眠一段时间。当它获取数据时,它会在线程A中引发一个委托事件,该事件将返回到线程A以使用数据更新某些标签。

线程代码:

    private delegate void LabJackUSB_OnDataAvailableCallback(LabJackRef.Status LabJackStatus);
    private void LabJackUSB_OnDataAvailable(LabJackRef.Status LabJackStatus)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(new LabJackUSB_OnDataAvailableCallback(LabJackUSB_OnDataAvailable), new object[] { LabJackStatus });
        }
        else
        {
            // Do something with data here
        }
    }

线程B代码:

    public delegate void DataAvailable(LabJackRef.Status LabJackStatus);
    public event DataAvailable OnDataAvailable;

    private bool PollStatus(StepDefinition CurrentStep)
    {
        GetData();            
        AnnounceDataAvailable();
        return false;
    }

    private void AnnounceDataAvailable()
    {
        if (OnDataAvailable != null)
        {
            OnDataAvailable(USBStatus);
        }
    }

线程是执行步骤的while循环,然后休眠线程。 while循环继续,直到状态机执行其关闭步骤并将WorkerState.StateMachineComplete标志设置为true,此时while循环退出并且线程应该关闭。

    protected void Worker(object Worker)
    {
        while (true)
        {
            // see if we are waiting to close the thread
            if (((ThreadInfo)Worker).CloseThread)
            {
                // set flag to exit worker when complete
                WorkerState.ThreadClosing = true;

                // if we have finished closing the state machine, 
                // we can exit the while loop to close the thread
                if (WorkerState.StateMachineComplete)
                    break;

                // otherwise, jump to the last step
                StateMachine.JumpToLast(WorkerStateMachine);
            }

            // run the state machine
            StateMachine.ExecuteStep(WorkerStateMachine, WorkerState);

            // wait for the time defined in the current step
            ((ThreadInfo)Worker).WaitHandle.WaitOne(WorkerState.DelayTimeMS);
        }
    }

现在这种情况在多种情况下都很好(没有问题)。出于某种原因,当我是us我们的通告函数它不会关闭,但while循环内没有断点将停止调试器。对我而言,这意味着while循环不再循环,但我不知道这是怎么回事。我的应用程序中没有任何未处理的异常,因此没有线索。

如果我只是注释掉announce函数,那么线程就没有问题,所以我知道代码中没有问题来获取数据或设置标签。

如果我注释掉了对数据做任何事情的线程A部分,那么错误仍然存​​在,但如果我没有订阅线程A中的事件,它将正常关闭。

老实说,我甚至不知道如何开始调试,因为调试器无法在等待关闭的循环中的任何地方停止。

任何想法都将不胜感激!

谢谢, 约翰维克斯

0 个答案:

没有答案