是否有必要在EventHandler.BeginInvoke(C#.Net 3.5)的回调中调用EndInvoke

3 .net c# events multithreading asynchronous

我正在设置一个需要可靠且可扩展的WCF客户端和服务器场景,并且我正在尝试使其成为多线程的一部分.不可否认,我没有丰富的多线程经验.

在客户端上,来自服务器的回调(在本例中为"OnMessage")会触发应在后台传递的客户端事件.我将客户端的CallbackBehavior ConcurrencyMode设置为Single(至少目前为止).所以为了回复回调,而不是正常调用处理程序(处理程序(发送者,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);
}
Run Code Online (Sandbox Code Playgroud)

我可以用直接引用handler.EndInvoke或者一个空方法替换CompleteHandler,或者可能还有更多我应该做的事情吗?

此外,此时,事件订户阻止等待来自控制台的用户输入.当应用程序完成时,它将阻止等待数据库,或者从底部到顶部异步(所以这可能没有必要,但我仍然想知道).

Han*_*ant 8

是的,你必须.唯一的方法是找出被调用的方法是否引发了异常.并清理调用的远程状态,因此它可以被垃圾收集,而不是让它磨蹭10分钟.

  • 要清理远程状态,你只需要调用`EndInvoke` :) (3认同)