【问题标题】:C#: Task cancellation not working (CancellationTokenSource)C#:任务取消不起作用(CancellationTokenSource)
【发布时间】:2020-03-30 05:53:25
【问题描述】:

我有一些长时间运行的代码,我想以Task 运行并在需要时使用CancellationTokenSource 取消,但取消似乎不起作用,因为当调用tokenSource.Cancel() 时我的任务继续运行(没有例外抛出)。

可能遗漏了一些明显的东西?

下面的例子:

bool init = false;

private void Button1_Click(object sender, EventArgs e)
{
    CancellationTokenSource tokenSource = new CancellationTokenSource();
    CancellationToken token = tokenSource.Token;
    Task task = new Task(() =>
    {
        while (true)
        {
            token.ThrowIfCancellationRequested();

            if (token.IsCancellationRequested)
            {
                Console.WriteLine("Operation is going to be cancelled");
                throw new Exception("Task cancelled");
            }
            else
            {
                // do some work
            }
        }
    }, token);

    if (init)
    {
        tokenSource.Cancel();
        button1.Text = "Start again";
        init = false;
    } else
    {
        try
        {
            task.Start();
        } catch(Exception ex)
        {
            Console.WriteLine(ex.ToString());
        }
        button1.Text = "Cancel";
        init = true;
    }
}

【问题讨论】:

  • 您正在为每个Button1_Click 创建一个新的Task。尝试将tasktokenSource 变量移到外部作用域,并初始化一次。
  • @TheodorZoulias 好点,虽然当我将Task task 移出按钮单击处理程序时行为没有改变。仍然没有看到任何异常抛出。
  • 您还必须移动令牌源
  • @pinkfloydx33 是的,成功了(根据下面接受的答案)。谢谢。

标签: c# .net winforms task-parallel-library


【解决方案1】:

您的代码中的主要问题是您没有存储tokenSource。第二次Button1_Click 调用取消的令牌与您在第一次调用期间传递给任务的令牌不同。

第二个问题是您一遍又一遍地创建新任务,但您的逻辑表明您需要一个任务,该任务应在第一次单击时创建并在第二次单击时终止。

【讨论】:

  • 宾果游戏,将TaskCancellationTokenSourceCancellationToken 移出按钮单击处理程序解决了该问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多