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

Mat*_*att 7 .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();
    }
Run Code Online (Sandbox Code Playgroud)

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

indexerClient.UpdateIndex(indexElements);
Run Code Online (Sandbox Code Playgroud)

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

这还行吗?它似乎没有,它几乎就像在返回之前等待线程完成一样.

Bri*_*ian 11

这些是非常不同的.

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

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

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

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