我正在使用WCF编写应用程序,其中客户端订阅服务器,然后更新被推送回客户端。
订阅者使用在服务器上调用Subscribe()方法的DuplexPipeChannel订阅服务器。
服务器维护一个List<>订阅者,当有数据要推送给订阅者时,它会调用PushData()方法。
我的目的是遍历订阅者列表,依次为每个订阅者调用push方法。
我想知道的是:在我的Subscriber阻塞上调用push方法吗?连接失败或连接到其中一个用户的延迟是否会导致其他推送呼叫延迟(或更糟糕的失败)?
如果这是一个显而易见的问题,我很抱歉,但到目前为止我一直是.Net 2.0的人,所以我对WCF知之甚少。
我的WCF代码很容易基于this tutorial。
另一个问题 假设它是同步的,我最好是产生一个新线程来处理客户端请求,还是我最好为每个“推送服务器端”产生一个新线程?
答案 0 :(得分:4)
默认情况下,WCF调用是同步的,尽管它们可以配置为异步。见Jarrett的答案如下。看看here。无论您是否真正期待数据,您发送的每条消息都将收到结果。
呼叫将阻止,具体取决于您的服务器的功能。如果服务器上的PushData实际遍历订户列表并向每个订阅者列表发送消息,它将会。如果PushData仅插入数据而另一个线程处理将数据发送给订阅者,则只会在服务器插入数据并返回时阻止。
希望这有帮助。
编辑:关于产生客户端与服务器端的线程。服务器端。如果客户端呼叫需要一段时间,那就是,但如果由于服务器实际上在同一个呼叫中向其他客户端发送呼叫需要很长时间,那么就会出现问题。实际上我每次都不会真正生成一个新线程。只需在服务器端创建一个producer/consumer模式,这样每当数据项排队时,消费者就会选择它。天啊,你甚至可以拥有多个消费者。
答案 1 :(得分:3)
如果右键单击“服务引用”,则可以选择创建异步调用。 (设置对话框上有一个复选框。)我通常创建Async方法,然后监听结果。虽然它有点多工作,但我可以使用异步服务操作编写响应更快的应用程序。