取消长时间运行的异步WCF调用到SSRS

9

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

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

Render方法周围的代码已经支持取消令牌,并且按预期被取消。
然而,Render方法WCF调用本身不支持取消令牌,在我的情况下,此操作可能需要1-2小时,如果有人决定取消,我不想让我的服务停止运行那么长时间。
有没有一种方法可以取消正在进行的WCF调用,以便它可以抛出OperationCancelledException(或类似的异常),以不占用客户端应用程序资源?
1个回答

4
首先,您需要打开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。


这实际上并没有取消操作,它只是停止等待操作完成。 - yaakov
不,它不会。OP要求提供一种在某人取消请求时释放客户端应用程序资源的方法。 - Leonid Vasilev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接