我在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);
}
添加了我最初粘贴代码时忘记的日志记录布尔值。
答案 0 :(得分:0)
为什么不直接从GUI线程调用ReadAsync
(因为它已经异步),然后从完成回调再次调用它。不需要其他(显式)线程或同步。