1

在同步模型中,它很简单

using (MyServiceClient msc = new MyServiceClient())
{
   msc.Method();
}

但是如果我必须等到这个方法结束,然后做一些事情,它就行不通

private void EventHandler<MethodCompletedEventArgs> myEventHandler = new EventHandler<MethodCompletedEventArgs>(methodBody);

using (MyServiceClient msc = new MyServiceClient())
{
   msc.MethdCompleted += myEventHandler;
   msc.BeginMethod();
}

private void MethodBody()
{
//exception: client state is aborted
}

using另外如何在语句中调用异步方法?

4

2 回答 2

6

你不应该这样做。

您应该MyServiceClient正常实例化,然后Dispose在异步回调处理程序中实例化它。

这是确保实例在回调处理程序被调用后仍然存在并且在回调处理程序完成其工作后被销毁的唯一方法。

于 2012-10-15T14:34:20.037 回答
1

您可以存储对服务客户端的引用,并Dispose在事件回调后手动调用其方法。您只需要做一些额外的工作来管理异常并通常确保Dispose最终调用它。msc还要注意在等待旧实例完成时可能创建/覆盖多个实例的情况:

如果多次执行相同的代码,确保不会处理错误实例的一种方法是使用本地 lambda/匿名函数:

MyServiceClient msc = new MyServiceClient();

msc.MethdCompleted += (sender, args) => 
{
    try
    {
        myEventHandler(sender, args);
    }
    finally
    {
        msc.Dispose();
    }
};

msc.BeginMethod();

它可能会比这更混乱。如果抛出异常,msc.BeginMethod()您也应该抓住它并Dispose最有可能调用(但您不想Dispose多次调用)

于 2012-10-15T14:38:58.020 回答