终止调用本机代码的.Net线程

时间:2017-08-07 12:48:18

标签: c++ .net multithreading

我们说我们有代码:

var thread = new Thread(() => Native.SomeMethod());
thread.Start();

这里 Native.SomeMethod - 是在C ++中实现的持久操作。如何立即终止线程? thread.abort()在这种情况下没有帮助。

2 个答案:

答案 0 :(得分:0)

假设在运行Native方法以结束线程时一切正常,我认为Abort方法应该可以使用但是有一些注意事项。据我所知,它的工作原理是能够结束被阻塞的线程,但不确定它是否适用于非阻塞线程。

如果我理解你的意图正确,你想立即结束线程。你有没有想过后台运行?只是一个想法......但是如果你想结束这个话题我的想法如下。

在C#中,您有两种方法可以结束线程。中断和中止。

Abort通常用于强制释放被阻塞的线程。它会抛出您需要在catch块中处理的ThreadAbortException。但请注意,它会在catch块结束时再次重新抛出,因为它会尝试终止线程。为了避免这种情况,请在catch块中调用Thread.ResetAbort。

在你的情况下,我认为值得尝试类似下面的事情......(没试过它可能不起作用,但值得尝试)

 Thread thread = new Thread(() =>   try{ 

      Native.SomeMethod();
     //if this does not work add a blocking statement here  like 
    //Thread.Sleep(time in mls such as 2000)
      catch(ThreadAbortException){
       Thread.ResetAbort;
    }

);
thread.Start();

另一种方法是中断。

中断不会立即结束未被阻塞的线程,除非未处理ThreadInturruptException(类似于ThreadAbort Exception)。这种情况发生在下一个块之前,处于未处理ThreadInterruptException的位置。

请注意,中断和中止都有警告。有关Joseph Albahri在C#中进行谷歌线程的更多信息,请阅读。

如果线程中止不起作用,您可能正在尝试安全取消令牌是您拥有的另一个选项。尽管这可能有点涉及并且需要您稍微改变您的设计。但是,如果您知道取消令牌的方法,那么试一试是个好主意。

答案 1 :(得分:0)

Thread.Abort()抛出只适用于.NET代码的ThreadAbortException。 如果要在托管代码和本机代码中的线程之间进行互操作,则应该实现某种协议以更优雅地终止线程,例如,通过使用一个用作停止标志的共享volatile bool变量。

另见Question about terminating a thread cleanly in .NET