WCF 基于任务的操作异常处理和 TPL
WCF Task-Based Operations Exception Handling and TPL
我有一个使用基于任务的操作的 WCF
代理。我正在进行一个包含在 Parallel.ForEach()
中的方法调用。我正在调用的服务方法是 slow/long-running 操作,偶尔会出现 returns 异常。我无法在我的 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());
}
}
}
也许您不应该捕获 AggregateException 而应该捕获一般异常并将 AggregateException 处理移到 Parrallel.ForEach 循环之外。
MSDN: Handle Exceptions in Parallel Loops
如果您使用 IIS 托管 WCF 服务,请记住默认的 20 分钟空闲超时,除非更改。后台任务不算作非空闲请求,您可能会发现 IIS 停止了 WCF 服务,因为在 20 分钟空闲超时之前没有发出进一步的请求。
我有一个使用基于任务的操作的 WCF
代理。我正在进行一个包含在 Parallel.ForEach()
中的方法调用。我正在调用的服务方法是 slow/long-running 操作,偶尔会出现 returns 异常。我无法在我的 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());
}
}
}
也许您不应该捕获 AggregateException 而应该捕获一般异常并将 AggregateException 处理移到 Parrallel.ForEach 循环之外。
MSDN: Handle Exceptions in Parallel Loops
如果您使用 IIS 托管 WCF 服务,请记住默认的 20 分钟空闲超时,除非更改。后台任务不算作非空闲请求,您可能会发现 IIS 停止了 WCF 服务,因为在 20 分钟空闲超时之前没有发出进一步的请求。