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

问题描述:

我正在使用c#开发metro应用程序,我正在使用异步并等待关键字来创建地铁异步操作(下载数据等)。我总是显示模式“Please wait”对话框。我想添加“取消”按钮到这个模式对话框以允许取消后台操作。 但我不知道如何取消处理任务...有没有任何例子如何做到这一点?如何在c#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); 
} 
+0

你'StartTask()'方法使用'ToWork()',但我只能看到一个'的DoWork()'方法。这是故意的吗? – Nolonar 2013-04-10 11:22:12

您可以决定执行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(); 
+0

有没有复制和粘贴的例子? – 2013-04-10 11:20:13

+5

@MythRush,在某些时候,你实际上必须明白你在做什么! – spender 2013-04-10 11:22:41