使用Monitor Wait / Pulse在C#中进行线程同步

时间:2011-08-18 01:09:36

标签: c#

我在C#中有一个多线程项目,我正在研究,我控制工作线程的想法并不像我希望的那样容易。

在启动主GUI窗口时创建一个线程,这是它正在运行的函数:

    private void continueReading()
    {
        while (true)
        {
            lock (_lock)
            {
                while (!startDAQ)
                    Monitor.Wait(_lock);
                startDAQ = false;
                logging = true;

                daqTaskComponent1.ReadAsync();
            }
        }

    }

现在,当在GUI上单击一个按钮时,startDAQ被设置为true,并且_lock被激励以启动调用ReadAsync()的线程。

在Async的回调函数中,我锁定相同的_lock对象并执行一些计算,然后将startDAQ设置为true并再次设置脉冲。

这允许仅在回调准备好处理更多数据时才调用我的异步函数,这就是它需要的方式。

问题是我需要能够安全地暂停数据收集,方法是让continueReading线程在Monitor.Wait上暂停,并在暂停之前调用ReadAsync时允许回调完成。

当用户再次点击按钮暂停数据收集时,这是我正在运行的代码:

    lock (_lock)
    {
        startDAQ = false;
        Monitor.PulseAll(_lock);
        while (logging)
            Monitor.Wait(_lock);
    }

这不能正常工作,我遇到了一些僵局。这是我第一次使用Monitor和Wait / Pulsing在线程之间发出信号,所以我有点难过,并且有一种感觉,有一种更简单的方法来处理它。任何帮助或建议都表示赞赏。

编辑:以下是回调函数中的相关代码:

    lock (_lock)
    {
        //Lots of code here that just manipulates the data passed to the callback
        startDAQ = true;
        logging = false;
        Monitor.PulseAll(_lock);
    }

添加了我最初粘贴代码时忘记的日志记录布尔值。

1 个答案:

答案 0 :(得分:0)

为什么不直接从GUI线程调用ReadAsync(因为它已经异步),然后从完成回调再次调用它。不需要其他(显式)线程或同步。

相关问题