使用
标记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服务的实例。
这应该也有用吗?它似乎没有,它几乎就像在返回之前等待线程完成一样。
答案 0 :(得分:11)
这些是非常不同的。
在概念层面,IsOneWay = true表示消息传递模式是“发射并忘记”,而不是例如“请求 - 响应”。也就是说,IOW = true表示从客户端到服务器的消息,但不是从服务器到客户端的回复。相反,非IOW = true方法通常会有一条响应消息,即使返回类型为void(例如“空”消息)。
异步模式用于客户端代码的行为方式 - 例如是否会阻止等待返回值。 Async是一个“本地”的东西,有关详细信息,请参阅this blog。您可以为同步服务器提供异步客户端,也可以为异步服务器提供同步客户端。 WCF将在幕后为您提供编程模型。如果您有例如请求 - 响应消息传递模式并使用“生成异步”,生成的客户端将为您提供例如您可以调用异步的方法(例如,发送消息,并在回复到达时获得回调)。
因此,对“本地编程模型”使用“async”,并使用IOW进行“在线传输”。
请注意,在您的示例中,如果您将方法标记为IOW = true,那么我认为服务器代码中没有理由使用Thread.Start()。您可以在WCF为您的服务器提供的线程上完成工作。