2015-10-06 34 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