WCF 基于任务的操作异常处理和 TPL

本文关键字:操作 异常处理 TPL 任务 于任务 WCF | 更新日期: 2023-09-27 18:35:50

我有一个使用基于任务的操作的WCF代理。 我正在进行一个包装在Parallel.ForEach()中的方法调用。 我调用的服务方法是一个缓慢/长时间运行的操作,偶尔会返回异常。 我无法在我的 catch 块中捕获这些异常 - 永远不会命中块。 我能够捕获异常的唯一方法是使用同步服务方法。 如何使用异步服务方法捕获异常? 在处理过程中返回异常是否太晚?

Parallel.ForEach(campaignResults.SelectMany(cd => cd), result =>
    {
        try
            {
                retList.TryAdd(client.SubmitRequestAsync(result.id, requestDetail), item.id);
            }
        catch (AggregateException ex)
            {
                // NEVER HIT ON EXCEPTION
                foreach (Exception e in ex.InnerExceptions)
                    {
                        Trace.TraceError(e.ToString());
                    }
            }
     }

WCF 基于任务的操作异常处理和 TPL

也许你不应该捕获 AggregateException,而应该捕获一个一般异常,并将 AggregateException 处理移到 Parrallel.ForEach 循环之外。

MSDN:处理并行循环中的异常

如果使用 IIS 承载 WCF 服务,请记住,除非更改,否则默认的 20 分钟空闲超时。后台任务不计为非空闲请求,您可能会发现 IIS 会停止 WCF 服务,因为在 20 分钟空闲超时之前不会发出进一步的请求。