我们说我们有代码:
var thread = new Thread(() => Native.SomeMethod());
thread.Start();
这里 Native.SomeMethod - 是在C ++中实现的持久操作。如何立即终止线程? thread.abort()在这种情况下没有帮助。
答案 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变量。