gpt4 book ai didi

.net-4.0 - 如何强制在继续任务中观察到任务的异常?

转载 作者:行者123 更新时间:2023-12-04 16:44:50 26 4
gpt4 key购买 nike

我有一项任务要执行 HttpWebRequest使用

 Task<WebResponse>.Factory.FromAsync(req.BeginGetRespone, req.EndGetResponse)

这显然会因 WebException 而失败.给来电者我想返回一个 Task<HttpResult>哪里 HttpResult是封装响应(或不封装)的辅助类型。在这种情况下,4xx 或 5xx 响应也不异常(exception)。

因此,我在请求任务中附加了两个延续。一带 TaskContinuationOptions OnlyOnRanToCompletion另一个是 OnlyOnOnFaulted .然后将整个内容包裹在 Task<HttpResult> 中选择一个结果,无论哪个延续完成。

三个子任务(请求加上两个延续)中的每一个都使用 AttachedToParent 创建。选项。

但是当调用者等待返回的外部任务时,一个 AggregateException抛出请求失败。

我想在故障继续中观察 WebException所以客户端代码可以只看结果。添加 Wait在错误继续抛出中,但是围绕此问题进行 try catch 无济于事。也不看 Exception属性(如“使用 Task.Exception 属性观察异常”部分提示 here )。

我可以安装一个 UnobservedTaskException事件处理程序来过滤,但由于事件没有提供与故障任务的直接链接,这可能会在应用程序的这一部分之外进行交互,并且是一个大锤敲碎坚果的情况。

给定一个故障实例 Task<T>有没有办法将其标记为“故障处理”?

简化代码:
public static Task<HttpResult> Start(Uri url) {
var webReq = BuildHttpWebRequest(url);
var result = new HttpResult();
var taskOuter = Task<HttpResult>.Factory.StartNew(() => {
var tRequest = Task<WebResponse>.Factory.FromAsync(
webReq.BeginGetResponse,
webReq.EndGetResponse,
null, TaskCreationOptions.AttachedToParent);
var tError = tRequest.ContinueWith<HttpResult>(
t => HandleWebRequestError(t, result),
TaskContinuationOptions.AttachedToParent
|TaskContinuationOptions.OnlyOnFaulted);
var tSuccess = tRequest.ContinueWith<HttpResult>(
t => HandleWebRequestSuccess(t, result),
TaskContinuationOptions.AttachedToParent
|TaskContinuationOptions.OnlyOnRanToCompletion);
return result;
});

return taskOuter;
}

和:
private static HttpDownloaderResult HandleWebRequestError(
Task<WebResponse> respTask,
HttpResult result) {
Debug.Assert(respTask.Status == TaskStatus.Faulted);
Debug.Assert(respTask.Exception.InnerException is WebException);
// Try and observe the fault: Doesn't help.
try {
respTask.Wait();
} catch (AggregateException e) {
Log("HandleWebRequestError: waiting on antecedent task threw inner: "
+ e.InnerException.Message);
}
// ... populate result with details of the failure for the client ...
return result;
}

( HandleWebRequestSuccess 最终将分拆更多任务以获取响应的内容...)

客户端应该能够等待任务,然后查看它的结果,而不会因为预期的和已经处理的错误而抛出。

最佳答案

最后我采取了我能想到的最简单的方法:隐藏异常。这是可能的,因为 WebException有房产Response它可以访问 HttpWebResponse我想要:

var requestTask = Task<WebResponse>.Factory.FromAsync(
webReq.BeginGetResponse,
ia => {
try {
return webReq.EndGetResponse(ia);
} catch (WebException exn) {
requestState.Log(...);
return exn.Response;
}
});

然后在继续任务中处理错误、重定向和成功响应。

关于.net-4.0 - 如何强制在继续任务中观察到任务的异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296120/

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