C# 如何在using语句中调用异步wcf方法?

C# 如何在using语句中调用异步wcf方法?,c#,wcf,asynchronous,using-statement,C#,Wcf,Asynchronous,Using Statement,在同步模型中,它只是 using (MyServiceClient msc = new MyServiceClient()) { msc.Method(); } 但若我必须等待这个方法的结束,然后再做一些事情,它就不能工作了 private void EventHandler<MethodCompletedEventArgs> myEventHandler = new EventHandler<MethodCompletedEventArgs>(methodBod

在同步模型中,它只是

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
}
private void EventHandler myEventHandler=new EventHandler(methodBody);
使用(MyServiceClient msc=new MyServiceClient())
{
msc.methodcompleted+=myEventHandler;
msc.BeginMethod();
}
私有void MethodBody()
{
//异常:客户端状态已中止
}

另外,如何使用语句调用
中的异步方法?

您不应该这样做

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


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

您不应该这样做

您应该正常地实例化
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

您可以存储对服务客户端的引用,并在事件回调后手动调用其
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

哪种类型的应用程序正在调用服务?在事件句柄中调用Dispose哪种类型的应用程序正在调用服务?在事件句柄中调用Dispose这是不够的。Dispose方法调用Close(),该方法通过网络进行调用,通知另一方断开连接。如果连接处于故障、关闭或关闭状态,则Close()调用将引发异常,您的资源将不会被清理。如果发生这种情况,则需要调用Abort()。因此,简单地使用try/finally或使用(){}是不安全的……这还不够。Dispose方法调用Close(),该方法通过网络进行调用,通知另一方断开连接。如果连接处于故障、关闭或关闭状态,则Close()调用将引发异常,您的资源将不会被清理。如果发生这种情况,则需要调用Abort()。因此,简单地使用try/finally或使用(){}是不安全的。。。