执行 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 方法时引发异常。我错过了啥吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
使用dynamic引发的异常:无法对 null 引用执行运行时绑定
wpf对类型“xxx.MainWindow”的构造函数执行符合指定的绑定约束的调用时引发了异常