2014-09-22 58 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