c# - 线程同步和中止

标签 c# multithreading c++-cli

结束我其中一个线程的工作时,我遇到了一个小问题。首先,这是应用程序的“布局”:

线程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/

相关文章:

C#:Form.DoubleBuffered = true 会破坏透明度

c# - 从 CRM 4 和 2011 中的站点地图打开 ASPX 页面

python PyQt : Is it possible to use QThread with a non-GUI program?

c# - C++/Cli 向托管 Action<T1,T2> 对象添加回调

c# - 我应该为我的应用程序使用托管 C++ 还是 C#?

c# - 错误 : GenerateWinPRTManifest

c# - 为什么我的 C# 应用程序无法在 Windows 7 中创建文件?

java - java应用程序强制关闭时调用方法

在 boost::shared_ptr operator bool() 上旋转时需要 C++ volatile?

visual-studio-2010 - 视觉C++ 2010 : Changes to MSVC runtime deployment (no more SxS with manifest)