8

用标记 WCF 方法有什么区别

[OperationContract(IsOneWay = true)]

属性并在添加服务引用时检查生成异步操作复选框?

从我读过的内容来看,调用的异步性质似乎应该只在客户端定义。如果是这样,那有什么意义[OperationContract(IsOneWay = true)]呢?

现在,我只是在 WCF 方法中运行了以下方法。

 public void UpdateIndex(IndexElement[] indexElements)
    {
        // start the update on a new thread.
        Thread thread = new Thread(() => UpdateIndexThread(indexElements));
        thread.Start();
    }

我在客户的代码中创建了一个服务引用,我只需调用:

indexerClient.UpdateIndex(indexElements);

indexerClient我的 WCF 服务的实例在哪里。

这也应该有效吗?似乎没有,就好像它在返回之前等待线程完成一样。

4

1 回答 1

11

这些是非常不同的。

在概念层面,IsOneWay=true 表示消息传递模式是“即发即弃”,而不是“请求-响应”。也就是说,IOW=true 表示有消息从客户端到服务器,但没有从服务器到客户端的回复。相反,非 IOW=true 方法通常会有响应消息,即使返回类型为 void(例如“空”消息)。

异步模式适用于客户端代码的行为方式——例如,它是否阻塞等待返回值。异步是“本地”的东西,有关详细信息,请参阅此博客。您可以将异步客户端用于同步服务器,也可以将同步客户端用于异步服务器。WCF 将在幕后发挥魔力,为您提供任一编程模型。如果您有例如请求-响应消息传递模式并使用“生成异步”,则生成的客户端将为您提供例如可以调用异步的方法(例如发送消息,并在回复到达时获得回调)。

因此,将“异步”用于“本地编程模型”,并将 IOW 用于“在线消息传递”。

请注意,在您的示例中,如果您将方法标记为 IOW=true,那么我认为服务器代码中的 Thread.Start() 没有理由。您可以直接在 WCF 为您的服务器提供的线程上完成工作。

于 2009-12-14T23:32:02.167 回答