天天看點

Task中的取消功能:使用的是CacellationTokenSoure解決多任務中協作取消和逾時取消方法

//【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秒後自動取消
}
           

繼續閱讀