簡體   English   中英

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

[英]Timeout Pattern - How bad is Thread.Abort really?

我在各種網站上看到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;
        }
    }

基本上你在談論中止一項行動(據我們所知)沒有優雅的流產方式。

這意味着沒有安全的方法可以中止它。 Thread.Abort不是一件好事 - 有各種各樣的競爭條件和你可以進入的丑陋情況(參見理查德答案中的鏈接)。 我會非常努力地避免想要取消不知道取消的操作 - 如果你必須這樣做,請考慮重新啟動整個應用程序,因為你可能不再處於理智狀態。

可能非常糟糕。

中止的線程可能會使共享狀態損壞,可能會使異步操作運行,...

請參閱Joe Duffy的博客: “托管代碼和異步異常加固”

這很糟糕,因為線程可能處於不一致狀態或處於某些工作中,並且沒有機會清除自己。

要正確關閉它,通過調用方法或設置屬性來指示它停止正在執行的操作,然后在關閉應用程序或轉移到其他任務之前執行Thread.Join等待它關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM