public class Worker
{
private CancellationTokenSource cts;
private Thread t;
public Worker()
{
cts = new CancellationTokenSource();
t = new Thread(() => { ThreadTask(cts.Token); });
}
~Worker()
{
cts.Dispose();
}
private void ThreadTask(CancellationToken ct)
{
try
{
while (true)
{
if (ct.IsCancellationRequested)
{
Debug.WriteLine("Cancelllation requested");
break;
}
// long task 1
Debug.WriteLine("Task 1 completed");
Thread.Sleep(2000);
// long task 2
Debug.WriteLine("Task 2 completed");
Thread.Sleep(2000);
// long task 3
Debug.WriteLine("Task 3 completed");
Thread.Sleep(2000);
// long task 4
Debug.WriteLine("Task 4 completed");
Thread.Sleep(2000);
Debug.WriteLine("All tasks completed");
}
}
catch (Exception ex)
{
Debug.WriteLine("Thread exception: " ex.ToString());
}
finally
{
// cleanup
Debug.WriteLine("Thread cleanup");
}
}
public void Start()
{
t.Start();
}
public void Stop()
{
cts.Cancel();
}
}
我想知道是否可以在執行緒完成執行之前中斷它。
例如,在上面描述的代碼中,當呼叫一個函式時Stop(),執行緒將在執行完成后停止,我想更快地停止它,例如在“長任務”之間甚至在一個Thread.Sleep(2000).
一個解決方案是在呼叫Stop()like時在任務執行緒中拋出例外Thread.Abort(),但Thread.Abort()在 Net 6.0 上不起作用,我該怎么做?
環境:
- C#
- 網路 6.0
- 視窗 10 x64
- Visual Studio 2019 和 Visual Studio 2022
uj5u.com熱心網友回復:
你可以用這個Thread.Interrupt方法。當前 .NET 平臺支持此 API。
中斷處于
WaitSleepJoin執行緒狀態的執行緒。如果這個執行緒當前沒有在等待、睡眠或加入狀態中被阻塞,那么它會在下一次開始阻塞時被中斷。
ThreadInterruptedException在被中斷的執行緒中拋出,但直到執行緒阻塞。如果執行緒從不阻塞,則永遠不會拋出例外,因此執行緒可能會完成而不會被中斷。
您必須ThreadInterruptedException在ThreadStart委托主體內部處理可能的情況,否則在Interrupt呼叫時行程可能會崩潰。或者,您可以使用通用catch (Exception)處理程式處理所有例外,就像您目前所做的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/348152.html
