执行 Task.Cancel 方法时引发异常。我错过了啥吗? [复制]

Posted

技术标签:

【中文标题】执行 Task.Cancel 方法时引发异常。我错过了啥吗? [复制]【英文标题】:Exception is thrown when I execute Task.Cancel method. Am I missing something? [duplicate]执行 Task.Cancel 方法时引发异常。我错过了什么吗? [复制] 【发布时间】:2021-09-14 04:17:48 【问题描述】:

当我点击btnStart 时,循环开始,值被添加到listBox1。我想在单击btnPause 时暂停执行,并在单击btnStart 时再次继续。我如何实现这一目标?请帮我。下面的代码我试过但没有运气。

CancellationTokenSource source = new CancellationTokenSource();

private void btnStart_Click(object sender, EventArgs e)

    //here I want to start/continue the execution
    StartLoop();


private async void StartLoop()

    for(int i = 0; i < 999999; i++)
    
        await Task.Delay(1000, source.Token);
        listBox1.Items.Add("Current value of i = " + i);
        listBox1.Refresh();
    


private void btnPause_Click(object sender, EventArgs e)

    //here I want to pause/stop the execution
    source.Cancel();

【问题讨论】:

你有什么问题? 抛出异常什么异常? 【参考方案1】:

您可以使用 Stephen Cleary 的 Nito.AsyncEx.Coordination 包中的 PauseTokenSource/PauseToken 组合。它与 CancellationTokenSource/CancellationToken 组合的概念类似,但它不是取消,而是暂停等待令牌的工作流。

PauseTokenSource _pauseSource;
CancellationTokenSource _cancelSource;
Task _loopTask;

private async void btnStart_Click(object sender, EventArgs e)

    if (_loopTask == null)
    
        _pauseSource = new PauseTokenSource()  IsPaused = false ;
        _cancelSource = new CancellationTokenSource();
        _loopTask = StartLoop();

        try  await _loopTask;  // Propagate possible exception
        catch (OperationCanceledException)   // Ignore cancellation error
        finally  _loopTask = null; 
    
    else
    
        _pauseSource.IsPaused = false;
    


private async Task StartLoop()

    for (int i = 0; i < 999999; i++)
    
        await Task.Delay(1000, _cancelSource.Token);
        await _pauseSource.Token.WaitWhilePausedAsync(_cancelSource.Token);
        listBox1.Items.Add("Current value of i = " + i);
        listBox1.Refresh();
    


private void btnPause_Click(object sender, EventArgs e)

    _pauseSource.IsPaused = true;


private async void btnStop_Click(object sender, EventArgs e)

    _cancelSource.Cancel();

【讨论】:

以上是关于执行 Task.Cancel 方法时引发异常。我错过了啥吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

linq 在查询表达式中处理异常

使用dynamic引发的异常:无法对 null 引用执行运行时绑定

wpf对类型“xxx.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常

如果第一个语句引发异常,是不是会执行以下语句?

看起来 is_nothrow_constructible_v() 在 MSVC 中被破坏了,我错了吗?

raise的使用