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また、古いインスタンスが完了するのを待っている間にの複数のインスタンスを作成/上書きする状況にも注意してください。

同じコードを複数回実行する場合に間違ったインスタンスを破棄しないようにする 1 つの方法は、ローカルのラムダ/匿名関数を使用することです。

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 に答える