我在后台线程上连接到 SSRS 2005 服务并调用 Render 方法
https://msdn.microsoft.com/en-us/library/reportexecution2005.reportexecutionservice.render.aspx
Render 方法周围的代码没有问题,内置了取消 token 支持并按预期取消了。
但是渲染方法 WCF 调用本身不支持取消 token ,在我的情况下,此操作最多可能需要 1 到 2 个小时,如果有人决定取消,我不想让我的服务中断这么久.
有没有办法取消 WCF 调用“飞行中”,以便它可以抛出 operationcancelledexception(或类似的东西)而不是占用我的客户端应用程序资源?
最佳答案
首先你需要turn on asynchronous methods generation对于 WCF 客户端。您需要创建并await
一个新任务,该任务将在 SSRS 操作完成或请求取消时结束。您可以使用 How do I cancel non-cancelable async operations? 中的 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 .
关于c# - 取消对 SSRS 的长时间运行的异步 WCF 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35253255/