2013-04-10 103 views
3

我正在使用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

回答

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

有沒有複製和粘貼的例子? – 2013-04-10 11:20:13

+5

@MythRush,在某些時候,你實際上必須明白你在做什麼! – spender 2013-04-10 11:22:41