C#对每个创建的任务使用取消令牌

时间:2020-08-18 04:13:22

标签: c# wpf task

我有一个task方法,该方法会在MainWindow中生成温度曲线,但是当用户将大量(生产的物品)数据输入烤箱并每30秒记录一次温度时,就会以另一种形式调用该方法。

public static async Task genLotProfile(string lotno,string filename, string datch,CancellationToken token)

try
{
       //get temperature and do other stuff
       Tprofile temp = getLogData(datch); 
       
       //task delay
       while (!token.IsCancellationRequested)
      {
          //Task delay
          await Task.Delay(30000, token);
      }
}
catch (OperationCanceledException e)
{

}

我的想法是每次输入很多时在输入表单中的回车按钮功能上调用它。

private void EnterBtn_Click(object sender, RoutedEventArgs e)
{
   //do other stuff

   //Call generate temp profile
    string filename = MainWindow.getTempProfileName(MainWindow.datachannel, lotnoTBX.Text);
                
    CancellationToken token = source.Token;
                
    MainWindow.genLotProfile(lotnoTBX.Text, filename, MainWindow.datachannel, token);
}

我还有一个单独的取消课程

    class Cancel
    {
        CancellationTokenSource _source;

        public Cancel(CancellationTokenSource source)
        {
            _source = source;
        }

        public void cancelTask()
        {
            _source.Cancel();
        }
    }

问题是,我将在自己的条件下运行多个任务,并且当用户从烤箱中取出很多东西时,我想使用另一种输出形式上的Cancel类杀死特定任务,如果发生以下情况,取消令牌会杀死我所有正在运行的任务我执行以下操作

CancellationTokenSource source = new CancellationTokenSource();
CancellationToken token = source.Token;
Cancel c = new Cancel(source); 
c.cancelTask();

1 个答案:

答案 0 :(得分:0)

您需要为每个任务创建新的CancellationTokenSource:

private async void EnterBtn_Click(object sender, RoutedEventArgs e)
{
   //do other stuff

   //Call generate temp profile
    string filename = MainWindow.getTempProfileName(MainWindow.datachannel, lotnoTBX.Text);

    CancellationTokenSource source = new CancellationTokenSource();                
    CancellationToken token = source.Token;
                
    await MainWindow.genLotProfile(lotnoTBX.Text, filename, MainWindow.datachannel, token);
}

取消特定任务时,只需要在令牌的正确实例上调用cancel()。