gpt4 book ai didi

c# - 如何取消异步 WCF 调用?

转载 作者:行者123 更新时间:2023-11-30 19:56:37 26 4
gpt4 key购买 nike

我一直在尝试找出如何基于新的 .NET 4.5 CancellationToken 机制实现 WCF 调用取消。我发现的所有示例都不是基于 WCF 的,并且没有跨越服务边界。

我的服务:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class MyService : IMyService
{
public void LongOperation()
{
// do stuff that takes ages...
// please cancel me!
}
}

我的客户(桌面应用程序):

使用自动生成的代理:

private async void DoLongRunningTaskAsync()
{
var asyncTask = _myService.LongOperationAsync();
await asyncTask;
}

如何取消这个任务?请提供适用于 .NET 4.5+ 上的 WCF 的具体示例

编辑:

下面的答案似乎表明由于技术原因这是不可能的。所以,想象一下,我创建服务 ContextMode=Session,然后设置一个名为 cancellationPending=true 的静态变量(在单独的服务调用中),我的原始调用仍在运行这个阶段,它会定期检查该变量。我仍然无法取消吗?这仍然是不可能的吗?如果是,为什么?

最佳答案

两个词——这是不可能的。

如果您了解 WCF 调用的本质,它就会变得显而易见。

看你的例子,我们通常看到的是:两台独立的机器 A 和 B,通过网络连接。在机器 A 上,您有一些监听套接字的组件,当它收到命令时,它开始同步长计算 RemoteCall()

在机器 B 上,你有一个客户端,它实际上有两个自动生成的方法

BeginRemoteCall->IAsyncResult + EndRemoteCall(IAsyncResult)

基于新任务的异步调用版本(又名 RemoteCallAsync()->Task)本质上是完全相同的,您始终可以使用 TaskFactory.FromAsync( BeginRemoteCall,EndRemoteCall)->任务

当你在客户端调用BeginRemoteCall时,你向第二台机器发送命令“请开始计算”,然后你添加一个回调,当计算完成并得出结果时,将调用它。在内部,此异步实现使用 I/O 完成端口并允许您的客户端是非阻塞的。

但如果服务器端的操作已经启动,则无法取消该操作。你可能对结果不感兴趣,你可以忽略你的回调,但服务器端的计算无论如何都会完成。

就是这样

关于c# - 如何取消异步 WCF 调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33395234/

26 4 0
文章推荐: c# - 在 C# 中,子类对象如何直接调用被重写的父类(super class)方法?
文章推荐: c - 求两个数的 GCD 的最快方法是什么?
文章推荐: c - C 中如何处理小括号中传递的参数?
文章推荐: c# - List 删除超过某个索引的对象(以及这样做的速度)