3

我正在用 C# 开发 Metro 应用程序,我正在使用 async 和 await 关键字来创建使 Metro 异步操作(下载数据等)。我总是显示模态“请稍候”对话框。我想在此模式对话框中添加“取消”按钮以允许取消后台操作。但我不知道如何取消处理任务......有什么例子可以做到这一点吗?

这是我的任务示例:

// Starts task
public void StartTask()
{
    // show the modal dialog with progress
    _progressDialog.IsOpen = true;
    _progressDialog.CancelClick += ProgressDialog_CancelClick;
    await ToWork();
    _progressDialog.IsOpen = false;
}


// Task which takes some seconds
private async Task DoWork()
{
   await DownloadData();
   await ProcessData();
}

// Cancel task
private void CancelClick(object sender, RoutedEventArgs e)
{
    // hide the modal dialog with progress        
    _progressDialog.IsOpen = false;
    // TODO: Cancel task
    GoBack(this, e);
}
4

1 回答 1

10

您可以决定实施DownloadData,以便他们在您需要取消时将其传递给他们ProcessDataCancellationToken

public Task DownloadData(CancellationToken tok)
{
    tok.ThrowIfCancellationRequested();//check that it hasn't been cancelled.

   //while doing your task check

  if (tok.IsCancellationRequested)
    {
                    // whatever you need to clean up.
                    tok.ThrowIfCancellationRequested();
     }


}

对于使用,您可以创建一个CancellationTokenSource并将令牌传递给该方法。

var source = new CancellationTokenSource();

await DownloadData(source.Token);

当您需要取消时,您可以调用Cancel()

source.Cancel();
于 2013-04-10T11:16:55.573 回答