//【1】Task任務的取消和判斷
static void Method8()
{
//建立取消信号源對象
CancellationTokenSource cts = new CancellationTokenSource();
Task task = Task.Factory.StartNew(() =>
{
while (!cts.IsCancellationRequested)//判斷任務是否被取消
{
Thread.Sleep(200);
Console.WriteLine($"子線程Id={Thread.CurrentThread.ManagedThreadId} {DateTime.Now.ToLongTimeString()}");
}
}, cts.Token);
//我們在這個地方模拟一個事件産生
Thread.Sleep(2000);
cts.Cancel();//取消任務,隻要傳遞這樣一個信号就可以
}
//【2】Task任務取消:同時我們也希望做一些清理的工作,也就是取消這個動作會觸發一個任務。
static void Method9()
{
CancellationTokenSource cts = new CancellationTokenSource();
Task task = Task.Factory.StartNew(() =>
{
while (!cts.IsCancellationRequested)
{
Thread.Sleep(500);
Console.WriteLine($"子線程Id={Thread.CurrentThread.ManagedThreadId} {DateTime.Now.ToLongTimeString()}");
}
}, cts.Token);
//注冊一個委托:這個委托将在任務取消的時候調用
cts.Token.Register(() =>
{
//在這個地方可以編寫自己要處理的邏輯...
Console.WriteLine("任務取消,開始清理工作......");
Thread.Sleep(2000);
Console.WriteLine("任務取消,清理工作結束......");
});
//這個地方肯定是有其他的邏輯來控制取消
Thread.Sleep(3000);//模拟其他的耗時工作
cts.Cancel();//取消任務
}
//【3】Task任務延時自動取消:比如我們請求一個遠端接口,如果長時間沒有傳回資料,我們可以做一個時間限制,逾時可以取消任務(比如微信紅包退回)
static void Method10()
{
CancellationTokenSource cts = new CancellationTokenSource();
// CancellationTokenSource cts = new CancellationTokenSource(3000);
Task task = Task.Factory.StartNew(() =>
{
while (!cts.IsCancellationRequested)
{
Thread.Sleep(300);
Console.WriteLine($"子線程Id={Thread.CurrentThread.ManagedThreadId} {DateTime.Now.ToLongTimeString()}");
}
}, cts.Token);
//注冊一個委托:這個委托将在任務取消的時候調用
cts.Token.Register(() =>
{
//在這個地方可以編寫自己要處理的邏輯...
Console.WriteLine("任務取消,開始清理工作......");
Thread.Sleep(2000);
Console.WriteLine("任務取消,清理工作結束......");
});
cts.CancelAfter(3000); //3秒後自動取消
}