[OperationContract(IsOneWay = true)]与检查生成的异步操作复选框之间有什么区别?

时间:2009-12-14 23:15:21

标签: .net wcf asynchronous-wcf-call

使用

标记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服务的实例。

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

1 个答案:

答案 0 :(得分:11)

这些是非常不同的。

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

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

因此,对“本地编程模型”使用“async”,并使用IOW进行“在线传输”。

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