【问题标题】:Cancellation of Long running async WCF Call to SSRS取消对 SSRS 的长时间运行的异步 WCF 调用
【发布时间】:2016-05-17 03:33:28
【问题描述】:

我正在后台线程上连接到 SSRS 2005 服务并调用 Render 方法

https://msdn.microsoft.com/en-us/library/reportexecution2005.reportexecutionservice.render.aspx

Render 方法周围的代码很好,内置取消令牌支持并按预期取消。

但是,Render 方法 WCF 调用本身不支持取消令牌,在我的情况下,此操作可能需要 1 到 2 个小时,如果有人决定取消,我不希望我的服务暂停这么久.

有没有办法取消 WCF 调用“飞行中”,以便它可以抛出 operationcancelledexception(或类似的东西)以不占用我的客户端应用程序资源?

【问题讨论】:

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


    【解决方案1】:

    首先你需要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。

    【讨论】:

    • 这实际上并没有取消操作,它只是停止等待操作完成。
    • 不,它没有。 OP 要求一种方法来释放他的客户端应用程序资源,以防有人取消请求。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-11-08
    • 2022-07-12
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多