Bil*_*eal 6 .net c# task-parallel-library
考虑一段代码,如:
private Task<string> Download()
{
var wc = new WebClient();
Task<string> backgroundDownload = wc.DownloadStringTaskAsync(this.Uri);
// Make sure the WebClient is disposed no matter what.
backgroundDownload.ContinueWith((downloadTask) => { wc.Dispose(); });
return backgroundDownload;
}
Run Code Online (Sandbox Code Playgroud)
我可以确定WebClient.Dispose()调用是否发生,并且所产生的任何异常都会重新抛出给调用者,就好像没有调用ContinueWith?
客户可以观察到这个ContinueWith吗 (例如稍后会调用ContinueWith删除Dispose调用吗?)
Ser*_*rvy 11
使用您拥有的代码,您可以确定无论代码是否成功完成,取消或抛出异常,都将触发延续.
您拥有的解决方案的一个潜在问题是,在处理Web客户端之前,期间或之后,可能会运行其他延续.如果在此清理运行之前运行其他延续没有问题,那么您拥有的就可以了.如果这是一个问题,那么你需要返回继续,而不是原始任务,但你还需要正确地传播结果(和例外/取消).使用async使这一切变得更容易:
private async Task<string> Download()
{
using(var wc = new WebClient())
return await wc.DownloadStringTaskAsync(this.Uri);
}
Run Code Online (Sandbox Code Playgroud)