如何在C# Metro应用程序中停止异步任务

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);
}

你的 StartTask() 方法使用了 ToWork(),但我只看到了一个 DoWork() 方法。这是有意为之吗? - Nolonar
1个回答

10

您可以决定实现DownloadDataProcessData,使它们接受一个CancellationToken并在需要取消时将其传递给它们。

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();

有没有任何复制和粘贴的示例? - Myth Rush
5
@MythRush,在某个时候,你实际上需要理解自己正在做什么! - spender

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接