将 TaskCompletionSource 设置为 Cancel 状态错误 WCF 通道
Setting a TaskCompletionSource to Cancel state faults WCF channel
我有一个异步 WCF 操作,我要在特定条件下取消它(见下文)。但是,此后我在客户端收到 Faulted
事件。我还在服务器端配置了 FaultHandler,但调用不会转到 HandleError
或 ProvideFault
。
这是基于 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
通常是一种不好的做法,因为它会将一个线程池线程换成另一个,然后再返回。
我有一个异步 WCF 操作,我要在特定条件下取消它(见下文)。但是,此后我在客户端收到 Faulted
事件。我还在服务器端配置了 FaultHandler,但调用不会转到 HandleError
或 ProvideFault
。
这是基于 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
通常是一种不好的做法,因为它会将一个线程池线程换成另一个,然后再返回。