我使用這個代碼給一個時間限制,以便另一個線程和一定時間後其中斷:獲取當前行從另一個託管線程
void RunWithTimeout(Action action, TimeSpan timeout)
{
AutoResetEvent signal = new AutoResetEvent(false);
Thread workerThread = null;
ThreadPool.QueueUserWorkItem((o) =>
{
workerThread = Thread.CurrentThread;
action();
signal.Set();
});
using (new Timer((o) => { signal.Set(); }, null, (int)timeout.TotalMilliseconds, Timeout.Infinite))
{
signal.WaitOne();
}
if (workerThread != null && workerThread.IsAlive)
{
try
{
workerThread.Abort();
}
catch { }
throw new System.TimeoutException();
}
}
我使用.NET 3.5,所以我不能使用任務 我現在拋出TimeoutException,但我想知道在調用Abort
時正在執行的行。
有沒有辦法讓另一個線程調用堆棧並將它傳遞給異常的StackTrace
屬性?
嗯,相當不健康的假設實際上有*是*「當前行」當代碼需要中止時。它幾乎肯定被埋在了內部CLR或操作系統功能中。那種讓線程掛起而不能及時完成工作的方式。中止線程是危險的,互聯網上有100萬條關於它的警告。 – 2014-10-31 12:49:12
中止線程充滿錯誤,除非在極端的情況下,否則不應該這樣做。如果你控制了代碼,你應該編寫線程來支持一些協作取消手段。在.NET 4.0中,你可以使用'CancellationToken'。在早期版本中,使用'WaitHandle'。看我的博客文章,[輪詢取消](http://blog.mischel.com/2013/05/07/polling-for-cancellation/) – 2014-10-31 12:50:18