我一直在寻找终止非UI线程的最佳方法。我发现,简而言之,线程处于while循环中,您只需将while循环条件设置为false以使线程退出循环:
https://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx
很好但我的线程不在while循环中。启动线程,然后使用其调度程序。它实际上是C#dll中的一个线程。 dll本身通过SWIG接口使用第二个C ++ dll。长话短说,我需要一名调度员。
在进一步说明之前,我想提一下一切正常。但我发现停止dll线程的唯一方法是调用Thread.Abort()。我想以更优雅的方式来做这件事。
在使用C#dll的UI线程中,创建了一个dll类的实例:
public CSomethingDll()
{
// This is the dll class constructor.
using (m_startEvent = new ManualResetEvent(false))
{
m_mainSdkThread = new Thread(DllThreadEntryPoint);
m_mainSdkThread.Name = "DLL THREAD";
m_mainSdkThread.Start(m_startEvent);
m_startEvent.WaitOne();
}
}
[STAThreadAttribute]
public void DllThreadEntryPoint (object o)
{
m_dispatcher = System.Windows.Threading.Dispatcher.CurrentDispatcher;
(o as ManualResetEvent).Set();
System.Windows.Threading.Dispatcher.Run();
// The dispatcher is now running and ready for calls to BeginInvoke().
}
dll线程的调度程序现在正在运行。 UI线程现在可以通过调用dll的InitializeA方法来初始化dll:
public void InitializeA()
{
m_dispatcher.BeginInvoke(EvInitialize);
}
现在,当UI线程终止时,当应用程序关闭时,UI线程调用FinalizeA方法:
public void FinalizeA()
{
m_dispatcher.BeginInvoke(EvFinalize);
}
在dll线程中,完成了一些事情以终止所有内容并释放资源。一切正常。但我发现停止dll线程的唯一方法是调用Thread.Abort():
m_dispatcher.Thread.Abort();
现在,是否有一些技巧可以阻止dll线程通过Dispatcher?某种方法可以停止调度程序,然后终止关联的线程?
谢谢!