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

标签 c# microsoft-metro

我正在用 C# 开发 Metro 应用程序,我正在使用 async 和 await 关键字来创建 make 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);
}

最佳答案

您可以决定实现 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 并将 token 传递给该方法。

var source = new CancellationTokenSource();

await DownloadData(source.Token);

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

source.Cancel();

关于c# - 如何在 C# Metro 应用程序中停止异步任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15924297/

相关文章:

c# - 不带空格的字符串长度 (C#)

c# - LINQ 表达式类可以实现观察者模式而不是延迟执行吗?

c# - 将 C# 对象列表解析为 JS 中的键值对

jquery - 如何在点击时使用 jquery 调整临时 html 元素的大小?

c# - 尝试在 InstalledLocation StorageFolder 中创建文件异步时访问被拒绝?

c# - CancellationTokenSource.Cancel 抛出 ObjectDisposedException

c# - 如何在运行时更改 Web API 的连接字符串

c# - 在已完成的事件 Windows 8 App 中从 Storyboard 获取 UIElement

xaml - 数据绑定(bind)到 ComboBox c++/cx XAML Metro 应用程序时 SelectedValue、SelectedIndex 的问题

javascript - 通过 Javascript 在 Windows Metro 应用程序中打开 url