取消对 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 调用"进行中",以便它可以引发操作取消异常(或类似内容),从而不占用我的客户端应用程序资源?

取消对 SSRS 的长时间运行的异步 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。