停止不在while循环中的C#线程

时间:2015-10-06 13:37:25

标签: c# multithreading dll

我一直在寻找终止非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?某种方法可以停止调度程序,然后终止关联的线程?

谢谢!

1 个答案:

答案 0 :(得分:1)

如何终止您的UI线程,您是否正确退出了调度程序?

您确实需要to call Dispatcher.ExitAllFrames才能退出Run方法。