在同步模型中,它只是
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
}
还有如何在语句中调用异步 mehod using
?
你不应该这样做。
您应该正常实例化MyServiceClient
,然后在异步回调处理程序中Dispose
它。
这是确保实例在调用回调处理程序后仍然存在并在回调处理程序完成其工作后
您可以存储对服务客户端的引用,并在事件回调后手动调用其Dispose
方法。您只需要做一些额外的工作来管理异常,并通常确保最终调用Dispose
。还要注意在等待旧实例完成时可能创建/覆盖多个msc
实例的情况:
确保在多次执行相同代码时不会释放错误实例的一种方法是使用本地 lambda/anonymous 函数:
MyServiceClient msc = new MyServiceClient();
msc.MethdCompleted += (sender, args) =>
{
try
{
myEventHandler(sender, args);
}
finally
{
msc.Dispose();
}
};
msc.BeginMethod();
它可能会变得比这更混乱;如果抛出异常msc.BeginMethod()
你也应该抓住它并最有可能调用Dispose
(但你不想多次调用Dispose
)