将 TaskCompletionSource 设置为 Cancel 状态错误 WCF 通道

Setting a TaskCompletionSource to Cancel state faults WCF channel

我有一个异步 WCF 操作,我要在特定条件下取消它(见下文)。但是,此后我在客户端收到 Faulted 事件。我还在服务器端配置了 FaultHandler,但调用不会转到 HandleErrorProvideFault

这是基于 Task 的 WCF 操作的默认行为吗?我们不应该在客户端得到一个 OperationCanceledException 吗?

示例代码

操作:

Task<MyResult> CalculateResultAsync(SomeParameter parameter);

服务端:

Task<MyResult> CalculateResultAsync(SomeParameter parameter)
{
    TaskCompletionSource<MyResult> tcs = new TaskCompletionSource<MyResult>();

    Task.Run(() => {
        //do something
        //based on some condition cancel tcs
        tcs.SetCanceled();
    });

    return tcs.Task;
}

服务的实现不改变 SOAP 协议。

如果服务出现故障(取消),则客户端会收到故障。

除此之外,在服务器代码上使用 Task.Run 通常是一种不好的做法,因为它会将一个线程池线程换成另一个,然后再返回。