我正在建立一个需要可靠和可扩展的 WCF 客户端和服务器场景,并且作为其中的一部分,我正在尝试使其多线程化。诚然,我没有广泛的多线程经验。
在客户端上,来自服务器的回调(在此例中为 "OnMessage")触发了应该在后台传递的客户端事件。我将客户端的 CallbackBehavior ConcurrencyMode 设置为 Single(至少现在是这样)。因此,为了回复回调,而不是像正常情况下调用处理程序(无论是 handler(sender, eventargs 还是 handler.Invoke...),我正在调用 handler.BeginInvoke。
一切都很好,但在回调中,我想知道是否需要显式调用 EndInvoke,或者我可以什么也不做(这里显示出了我的缺乏多线程经验)。
在客户端上,来自服务器的回调(在此例中为 "OnMessage")触发了应该在后台传递的客户端事件。我将客户端的 CallbackBehavior ConcurrencyMode 设置为 Single(至少现在是这样)。因此,为了回复回调,而不是像正常情况下调用处理程序(无论是 handler(sender, eventargs 还是 handler.Invoke...),我正在调用 handler.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);
}
我能否用handler.EndInvoke的直接引用、一个空方法或者其他方式来替代CompleteHandler?是否有更好的方法?
此外,目前事件订阅方在等待控制台用户输入时会阻塞。当应用程序完成后,它将要么阻塞等待数据库,要么是自下而上的异步调用(因此可能不必要,但我仍然想知道)。
EndInvoke
即可 :) - Anton Tykhyy