一尘不染

超时模式-Thread.Abort到底有多糟糕?

c#

我在各种网站上都读到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;
        }
    }

阅读 327

收藏
2020-05-19

共1个答案

一尘不染

可能 非常糟糕。

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

请参阅Joe
Duffy的博客:“托管代码和异步异常强化”

2020-05-19