如何解决使用 CancellationTokenSource 从按钮单击取消异步任务不起作用
我需要做的是取消正在异步运行的任务。单击取消按钮时应取消任务。我已经用 CancellationTokenSource
完成了。但它不能正常工作。
public class classA
{
CancellationTokenSource _tokenSource = null;
public void OnCancelButtonClick()
{
MessageBox.Show("Do you Really want to cancel upload");
_tokenSource = new CancellationTokenSource();
_tokenSource.Cancel();
}
public async void UploadBtnClick(object param )
{
_tokenSource = new CancellationTokenSource();
var token = _tokenSource.Token;
try
{
await Task.Run(() => UploadFunction(token));
}
catch(OperationCanceledException ex)
{
MessageBox.Show(ex.Message);
}
finally
{
_tokenSource.dispose();
}
}
public Task<bool> UploadFunction(CancellationToken token)
{
foreach
{
//code here
if (token.IsCancellationRequested)
{
token.ThrowIfCancellationRequested();
}
}
}
}
我正在从另一个函数调用 OnCancelButtonClick
public class classB
{
public void CancelUploadBtnExecute(object param)
{
Filesviewmodel vm = new Filesviewmodel();
vm.OnCancelButtonClick();
}
}
当我点击 OnCancelButtonClick
时,IsCancellationRequested
是 false
,但没有反映在 UploadFunction
中,因此任务不会停止。
解决方法
这是因为您正在 CancellationTokenSource
中初始化新的 OnCancelButtonClick()
。
只需从 OnCancelButtonClick()
_tokenSource = new CancellationTokenSource();
UploadFunction
方法正在使用 CancellationTokenSource
方法中从 UploadBtnClick
创建的令牌。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。