取消对 SSRS 的长时间运行的异步 WCF 调用
本文关键字:异步 WCF 调用 运行 长时间 SSRS 取消 | 更新日期: 2023-09-27 18:33:30
我正在后台线程上连接到 SSRS 2005 服务并调用 Render 方法
https://msdn.microsoft.com/en-us/library/reportexecution2005.reportexecutionservice.render.aspx
围绕 Render 方法的代码很好,内置了取消令牌支持,并按预期取消。
但是,Render 方法 WCF 调用本身不支持取消令牌,在我的情况下,此操作最多可能需要 1 - 2 小时,如果有人决定取消,我不想将我的服务保留这么长时间。
有没有办法取消 WCF 调用"进行中",以便它可以引发操作取消异常(或类似内容),从而不占用我的客户端应用程序资源?
首先,您需要为 WCF 客户端启用异步方法生成。然后,您需要创建并await
一个新任务,该任务将在 SSRS 操作完成或请求取消时结束。您可以使用如何取消不可取消的异步操作中的扩展方法WithCancellation
实现此目的?品:
public static async Task<T> WithCancellation<T>(
this Task<T> task, CancellationToken cancellationToken)
{
var tcs = new TaskCompletionSource<bool>();
using(cancellationToken.Register(
s => ((TaskCompletionSource<bool>)s).TrySetResult(true), tcs))
if (task != await Task.WhenAny(task, tcs.Task))
throw new OperationCanceledException(cancellationToken);
return await task;
}
像这样使用它:
// WithCancellation will throw OperationCanceledException if cancellation requested
RenderResponse taskRender = await ssrsClient.RenderAsync(renderRequest)
.WithCancellation(cancellationToken);
renderRequest
是生成的类RenderRequest
的实例。
我不确定如何从Render
操作的同步版本中显示的out
参数中访问值,因为我目前无法访问 SSRS。