c#中取消异步任务
本文关键字:任务 异步 取消 | 更新日期: 2023-09-27 18:02:43
我希望用户能够取消/中止由异步按钮调用的任务。我已经看了一下CancellationTokens,但我真的不明白如何实现它。
"下载"按钮:
private async void dlSelected_Click(object sender, RoutedEventArgs e)
{
try
{
if (dlDataGrid.SelectedIndex != -1)
{
object item = dlDataGrid.SelectedItem;
string name = (dlDataGrid.SelectedCells[0].Column.GetCellContent(item) as TextBlock).Text;
string dl = (dlDataGrid.SelectedCells[2].Column.GetCellContent(item) as TextBlock).Text;
dlSelected.IsEnabled = false;
refreshList.IsEnabled = false;
dlPRing.IsActive = true;
await DownloadFile2(name, dl, "./Data/Downloads/" + name);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
"下载"任务:
private async Task DownloadFile2(string name, string url, string path)
{
//Set status label
tbDLStatus.Text = "Downloading File...";
var DLclient = new WebClient();
DLclient.DownloadProgressChanged += (s, e) =>
{
//Set names for each property
tbDLPercent.Text = e.ProgressPercentage + "%";
tbFileName.Text = name;
tbDir.Text = path;
double progress = 0;
if (e.ProgressPercentage > progress)
{
//Change value of progressbar to download
pbProgress.Value = (e.ProgressPercentage / 100.0d);
progress = e.ProgressPercentage;
}
};
DLclient.DownloadFileCompleted += async (s, e) =>
{
if (e.Cancelled)
{
//Delete the file
if (File.Exists(path))
{
File.Delete(path);
}
}
else if (e.Error != null)
{
await this.ShowMessageAsync("Error!", "An error occured while attempting to download " + name + "! 'n'nPlease check your internet connection and try again in a few minutes.",
MessageDialogStyle.Affirmative);
//Delete the file
if (File.Exists(path))
{
File.Delete(path);
}
}
else
{
//Set for completed DL successfully.
if (cbAutoRun.IsChecked == true)
{
try
{
Process.Start(tbDir.Text);
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
//Allow open file/folder
btnOpen.IsEnabled = true;
btnOpenFolder.IsEnabled = true;
}
dlSelected.IsEnabled = true;
pbProgress.Value = 0;
tbDLStatus.Text = "Finished Downloading";
dlPRing.IsActive = false;
};
await DLclient.DownloadFileTaskAsync((url), path);
DLclient.Dispose();
}
所以我的问题是,如果我在下载一个大文件的过程中,我想通过一个按钮取消它,我该怎么做?
谢谢,
无法从外部取消任意任务。
幸运的是,WebClient
允许取消(尽管由于某种原因,它没有简单地采用CancellationToken
的方式):只要在你想取消挂起的异步操作时调用WebClient.CancelAsync()
。
如果您想使用CancellationToken
包装此功能,您可以这样做:
Task DownloadFileTaskAsync(this WebClient client, string address, string filename,
CancellationToken token)
{
token.Register(() => client.CancelAsync());
return client.DownloadFileTaskAsync(address, filename);
}