2015-10-06 33 views
0

我搜索了四處尋找終止非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線程?一些方法來停止調度程序,然後終止相關的線程?

謝謝!

+1

Dispatcher.InvokeShutdown()? – Ananke

+0

除非線程有一些方法來響應取消請求,否則我認爲終止是終止它的唯一方法。如果你希望在線程端處理它,代碼需要被添加到線程正在使用的方法中。 –

回答

1

你如何終止你的UI線程,你是否正常退出調度程序?

您確實需要to call Dispatcher.ExitAllFrames,以便Run方法退出。

+0

UI線程屬於常規的C#WPF應用程序。所以沒有什麼是通過手工來停止UI線程的。 感謝您的提示,它的工作原理:-) – ccaron