17
如何在線程中停止執行代碼如果需要很長時間。我有幾個線程一直在工作,但在線程中的代碼執行過長之後,應用程序停止響應。30秒後停止在線程中執行代碼
是否有可能,如果代碼沒有在30s內執行,線程將停止執行它並轉到下一個代碼...所以應用程序仍然活着並且不會停止響應。我正在使用C#.net 3.5
如何在線程中停止執行代碼如果需要很長時間。我有幾個線程一直在工作,但在線程中的代碼執行過長之後,應用程序停止響應。30秒後停止在線程中執行代碼
是否有可能,如果代碼沒有在30s內執行,線程將停止執行它並轉到下一個代碼...所以應用程序仍然活着並且不會停止響應。我正在使用C#.net 3.5
我在這裏的答案類似於我發佈的here。
您可以通過在監視線程中等待指定時間的工作線程,然後強制殺死工作線程(如果尚未完成)來完成此操作。請參閱下面的示例代碼。
但是,通常情況下,使用Thread.Abort
強制查殺線程並不是一個好主意,因爲目標線程不一定處於已知狀態,並且可能會對可能未釋放的資源打開句柄。使用Thread.Abort
是code smell。
更簡潔的方法是更改工作線程以管理其自己的生命週期。工作線程可以檢查它在已知檢查點執行了多長時間,然後在超出某個限制時停止執行。這種方法的缺點是需要在整個線程正在進行的實際工作中分散許多檢查點。而且,通過在檢查點之間進行太多計算,工作者線程可能很容易超過限制。
class Program
{
static void Main(string[] args)
{
if (RunWithTimeout(LongRunningOperation, TimeSpan.FromMilliseconds(3000)))
{
Console.WriteLine("Worker thread finished.");
}
else
{
Console.WriteLine("Worker thread was aborted.");
}
}
static bool RunWithTimeout(ThreadStart threadStart, TimeSpan timeout)
{
Thread workerThread = new Thread(threadStart);
workerThread.Start();
bool finished = workerThread.Join(timeout);
if (!finished)
workerThread.Abort();
return finished;
}
static void LongRunningOperation()
{
Thread.Sleep(5000);
}
}