超时模式 - Thread.Abort真的有多糟糕?

时间:2009-04-02 14:59:46

标签: c# multithreading extension-methods

我在各种网站上都看过Thread.Abort不是很好用。在这种情况下,如何实现超时模式?例如,我已经读过MS在整个框架中使用下面的模式(我已经用扩展方法包装)。就个人而言,我认为这是一个非常酷的扩展,但我担心Thread.Abort。有没有人有更好的方法?

 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;
        }
    }

3 个答案:

答案 0 :(得分:13)

基本上你说的是中止一项行动(据我们所知)没有优雅的流产方式。

这意味着没有安全方法可以中止它。 Thread.Abort不是一件好事 - 你可以进入各种竞争条件和丑陋的情况(参见Richard's answer中的链接)。我会尽力避免想要取消不知道取消的操作 - 如果你绝对这样做,请考虑重新启动整个应用程序,因为你可能不再在理智的状态。

答案 1 :(得分:10)

可能非常糟糕。

中止的线程可能会使共享状态损坏,可能会使异步操作运行,...

参见Joe Duffy的博客:"Managed code and asynchronous exception hardening"

答案 2 :(得分:2)

这很糟糕,因为线程可能处于不一致状态或处于某些工作中,并且没有机会自我解决。

要正确关闭它,通过调用方法或设置属性来指示它停止正在执行的操作,然后在关闭应用程序或转移到其他任务之前执行Thread.Join等待它关闭。