c# - 取消对 SSRS 的长时间运行的异步 WCF 调用

标签 c# wcf task-parallel-library reportingservices-2005

我在后台线程上连接到 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/

相关文章:

c# - 使用 WCF 查询 eBay API

c# - 如何使用异步/并行处理迭代执行深度优先搜索?

c# - 方法参数 C# 中的有界泛型类型

C# 相当于 VB6 'Type'

c# - 在重新启动 dotnet 错误之前等待文件更改

c# - WCF & CaSTLe Windsor - 看起来你忘了

wcf - 是否有使用 MSMQ 的简单 WCF 在线示例?

c# - 为什么我的 C# 代码在回调到 C++ COM 直到 Task.Wait/Thread.Join 之前会停止?

c# - 在 ASP.NET MVC 中通过 CancellationToken 中止 AJAX 请求

c# - 当浏览器在 MVC 中关闭时停止 session 过期