gpt4 book ai didi

c# - 将 ContinueWith 用作 "finally"操作是否安全?

转载 作者:太空狗 更新时间:2023-10-29 21:08:39 25 4
gpt4 key购买 nike

考虑一段代码:

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;
}

我能否确定 WebClient.Dispose() 调用发生并且产生的任何异常都被重新抛出给调用者,就好像没有调用 ContinueWith 一样?

客户端能否观察到这个ContinueWith? (例如,以后调用 ContinueWith 会删除 Dispose 调用吗?)

最佳答案

使用您拥有的代码,您可以确定无论代码是否成功完成、被取消或抛出异常,都会触发延续。

您所拥有的解决方案的一个潜在问题是,其他延续可能会在处理 Web 客户端之前、期间或之后运行。如果您在此清理运行之前运行的其他延续没有问题,那么您所拥有的就很好。如果这是一个问题,那么您将需要返回延续,而不是原始任务,但您还需要正确传播结果(和异常/取消)。 async 的使用使所有这些方式变得更容易:

private async Task<string> Download()
{
using(var wc = new WebClient())
return await wc.DownloadStringTaskAsync(this.Uri);
}

关于c# - 将 ContinueWith 用作 "finally"操作是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26004872/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com