C# 超时模式-线程有多糟糕。真的要中止吗?
我在各种网站上读到过这样的文章:Thread.Abort不太好用。在这种情况下,如何实现超时模式?例如,我读到MS在整个框架中使用下面的模式(我用扩展方法包装了它)。就个人而言,我认为这是一个非常酷的扩展,但我担心Thread.Abort。有人有更好的方法吗C# 超时模式-线程有多糟糕。真的要中止吗?,c#,multithreading,extension-methods,C#,Multithreading,Extension Methods,我在各种网站上读到过这样的文章:Thread.Abort不太好用。在这种情况下,如何实现超时模式?例如,我读到MS在整个框架中使用下面的模式(我用扩展方法包装了它)。就个人而言,我认为这是一个非常酷的扩展,但我担心Thread.Abort。有人有更好的方法吗 public static bool CallandWait(this Action action, int timeout) { Thread subThread = null; Action w
public static bool CallandWait(this Action action, int timeout)
{
Thread subThread = null;
Action wrappedAction = () =>
{
subThread = Thread.CurrentThread;
action();
};
IAsyncResult result = wrappedAction.BeginInvoke(null, null);
if (((timeout != -1) && !result.IsCompleted) && (!result.AsyncWaitHandle.WaitOne(timeout, false) || !result.IsCompleted))
{
if (subThread != null)
{
subThread.Abort();
}
return false;
}
else
{
wrappedAction.EndInvoke(result);
return true;
}
}
这是不好的,因为线程可能处于不一致的状态或者在某些工作的中间,并且没有机会清除自己。
要正确地关闭它,您可以通过调用一个方法或设置一个属性来发出信号,让它停止正在执行的操作,然后执行Thread.Join直到它关闭,然后再关闭您的应用程序或转到其他任务。基本上,您所说的是中止一个(据我们所知)无法中止的操作 这意味着没有安全的方法可以中止它
Thread.Abort
不是一件好事情,你可能会遇到各种各样的竞争条件和丑陋的情况(参见中的链接)。我会竭尽全力地避免取消那些不知道取消的行为——如果你真的必须这么做,考虑重新启动整个应用程序,因为你可能不再处于正常状态。 可能非常糟糕。
中止的线程可能导致共享状态损坏,可能导致异步操作运行 请参阅Joe Duffy的博客: