我搜索了四處尋找終止非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
除非線程有一些方法來響應取消請求,否則我認爲終止是終止它的唯一方法。如果你希望在線程端處理它,代碼需要被添加到線程正在使用的方法中。 –