[英]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
不是一件好事 - 有各種各樣的競爭條件和你可以進入的丑陋情況(參見理查德答案中的鏈接)。 我會非常努力地避免想要取消不知道取消的操作 - 如果你必須這樣做,請考慮重新啟動整個應用程序,因為你可能不再處於理智狀態。
這很糟糕,因為線程可能處於不一致狀態或處於某些工作中,並且沒有機會清除自己。
要正確關閉它,通過調用方法或設置屬性來指示它停止正在執行的操作,然后在關閉應用程序或轉移到其他任務之前執行Thread.Join等待它關閉。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.