2014-09-22 57 views
1

我有一個C#Windows窗體應用程序,其中包含多個DownloadStringTaskAsync()語句的一個示例顯示。我想創建一個停止按鈕來取消完整的功能。我嘗試添加cancelasync的代碼,但它一次只停止一條語句,然後進入下一條語句。如何停止多個webclient DownloadStringTaskAsync

private async void downloadfunction() 
{ 
    string s1 = await client.DownloadStringTaskAsync(url1); 
    //do something with s1 

    string s2 = await client.DownloadStringTaskAsync(url2); 
    //do something with s2 

    string s2 = await client.DownloadStringTaskAsync(url3); 
    //do something with s3 
} 

private void stop_Click(object sender, EventArgs e) 
{ 
    client.CancelAsync(); 
} 

如果我按下停止按鈕,觸發了stop_Click功能,它取消了第一次下載但隨後進入下一個。有沒有辦法通過點擊一下鼠標來停止所有的下載功能。

+2

閱讀有關.NET 4.0+中的取消的基本教程。 – usr 2014-09-22 11:47:48

+0

已閱讀有關MSDN上的cancelasync功能 – 2014-09-22 11:55:32

+1

而您的研究工作並未在此完成。瞭解如何取消一般工作。 https://www.google.com/webhp?complete=1&hl=zh-CN&gws_rd=ssl#complete=1&hl=zh-CN&q=.net+4.5+cancellation – usr 2014-09-22 11:57:27

回答

3

慣用的方式做這將是你的方法使用CancellationToken

(編輯:禮貌斯蒂芬·克利,評論)

token.ThrowIfCancellationRequested(); 
string s1 = await client.DownloadStringTaskAsync(url1); 
token.ThrowIfCancellationRequested(); 
//do something with s1 

token.ThrowIfCancellationRequested(); 
string s2 = await client.DownloadStringTaskAsync(url2); 
token.ThrowIfCancellationRequested(); 
//do something with s2 

token.ThrowIfCancellationRequested(); 
string s2 = await client.DownloadStringTaskAsync(url3); 
token.ThrowIfCancellationRequested(); 
//do something with s3 

token來自一個TaskCancellationSource.Token財產,然後你就可以通過取消:

source.Cancel(); 

除了client.CancelAsync()

請注意,許多API允許您將取消標記傳遞到的調用中;顯然不是這個,不幸的是。

+0

'token.ThrowIfCancellationRequested();' – 2014-09-22 12:07:40

+0

@StephenCleary d'oh!我檢查了那個......一定是錯過了它 – 2014-09-22 12:08:29

+0

+1將幫助功能中的重複取消和下載代碼封裝起來。 – usr 2014-09-22 12:26:57