【发布时间】:2010-11-15 17:38:27
【问题描述】:
我正在设置一个需要可靠和可扩展的 WCF 客户端和服务器方案,作为其中的一部分,我正在尝试使其成为多线程。诚然,我没有丰富的多线程经验。
在客户端,来自服务器的回调(在本例中为“OnMessage”)会触发应在后台传递的客户端事件。我将客户端的 CallbackBehavior ConcurrencyMode 设置为 Single(至少目前是这样)。因此,为了回复回调,而不是像往常一样调用处理程序(处理程序(发送者、事件参数或处理程序.Invoke...),我正在调用处理程序.BeginInvoke。
一切正常,但在回调中我想知道是否需要显式调用 EndInvoke 或者我是否基本上什么都不做(这是我缺乏多线程经验的表现)。
public void OnMessage(Message message)
{
EventHandler<MessageEventArgs> handler = OnServerMessage;
if (handler != null)
handler.BeginInvoke(this, new MessageEventArgs(message), CompleteHandler, handler);
}
public void CompleteHandler(IAsyncResult result)
{
((EventHandler<MessageEventArgs>)result.AsyncState).EndInvoke(result);
}
我可以将 CompleteHandler 替换为对 handler.EndInvoke 的直接引用,或者一个空方法,或者我应该做些什么吗?
此外,目前,事件订阅者会阻塞等待来自控制台的用户输入。当应用程序完成时,它会阻塞等待数据库,或者是异步自下而上(所以这可能没有必要,但我仍然想知道)。
【问题讨论】:
标签: c# .net multithreading events asynchronous