结束我其中一个线程的工作时,我遇到了一个小问题。首先,这是应用程序的“布局”:
线程1-工作线程(C++/CLI)-按预期运行并终止
for(...)
{
try
{
if(TabuStop) return;
System::Threading::Monitor::Enter("Lock1");
//some work, unmanaged code
}
finally
{
if(stop)
{
System::Threading::Monitor::Pulse("Lock1");
}
else
{
System::Threading::Monitor::Pulse("Lock1");
System::Threading::Monitor::Wait("Lock1");
}
}
}
线程2-显示结果线程(C#)
while (WorkerThread.IsAlive)
{
lock ("Lock1")
{
if (TabuEngine.TabuStop)
{
Monitor.Pulse("Lock1");
}
else
{
Dispatcher.BeginInvoke(RefreshAction);
Monitor.Pulse("Lock1");
Monitor.Wait("Lock1", 5000);
}
}
// Thread.Sleep(5000);
}
我试图像这样从应用程序主线程关闭整个过程:
TabuEngine.TabuStop = true; //terminates nicely the worker thread and
if (DisplayThread.IsAlive)
{
DisplayThread.Abort();
}
我也尝试使用DisplayThread.Interrupt,但是它始终在Monitor.Wait(“Lock1”,5000);上阻塞。我无法摆脱它。这是怎么了我应该如何执行同步并让它完成应做的工作?
//编辑
我什至现在不确定使用“Lock1”字符串的技巧是否真的有效并且锁是否放置在同一对象上。
最佳答案
您可以在MSDN (Example 2)上找到使用Monitors进行生产者/消费者同步的一个很好的例子。
有两个线程(生产者和使用者,类似于您的情况),但是通过引入锁定共享资源的第三类来完成同步。示例提供了完整的源代码,因此我没有在此处发布。
关于c# - 线程同步和中止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718945/