使用ContinueWith作为"最终"操作是否安全?

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)