问题描述
我需要做的是取消正在异步运行的任务。单击取消按钮时应取消任务。我已经用 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
创建的令牌。