我搜索了四处寻找终止非UI线程的最佳方法。我发现的是,总之,线程是一个while循环,你只需设置while循环条件为false,以使线程退出循环:停止不在while循环中的C#线程
https://msdn.microsoft.com/en-us/library/7a2f3ay4(v=vs.80).aspx
不错,但我的线程是不是在一段时间循环。该线程已启动,然后使用其调度程序。它实际上是C#dll中的一个线程。 dll本身通过SWIG接口使用第二个C++ dll。长话短说,我需要一个调度员。
现在在继续之前,我想提一提的是一切正常。但我发现停止dll线程的唯一方法是调用Thread.Abort()。我想以更优雅的方式来解决这个问题。
从UI线程,一个使用C#DLL,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.InvokeShutdown()? – Ananke
除非线程有一些方法来响应取消请求,否则我认为终止是终止它的唯一方法。如果你希望在线程端处理它,代码需要被添加到线程正在使用的方法中。 –