7

次のコードを使用して、WCF サービス メソッドを呼び出しています。

MyServiceClient proxy = new MyServiceClient();
proxy.Open();
proxy.Func1();
proxy.Close();
// Some other code
proxy.Open();
proxy.Func2();

proxy.Close();

「proxy.Open()」を 2 回目に呼び出しているときに例外が発生しますが、コードが機能することがあります。以下に示す次のコードも使用できますが、これは正常に機能します。

MyServiceClient proxy = new MyServiceClient();

proxy.Func1();

// Some other code

proxy.Func2();

proxy.Close();

また、関数を呼び出すより良い方法を知りたいです。どのアプローチがパフォーマンスを向上させますか?

4

4 に答える 4

9

接続を閉じると、それを再利用することはできません。

MyServiceClientその時点で新しいものを作成する必要があります。

MyServiceClient proxy = new MyServiceClient();
proxy.Open();
proxy.Func1();
proxy.Close();

// Some other code

proxy = new MyServiceClient(); // Recreate the client here
proxy.Open();
proxy.Func2();
proxy.Close();
于 2013-09-23T18:30:10.087 に答える
4

WCF は、.NET フレームワークの数少ないインスタンス (おそらく唯一のインスタンス) の 1 つであり、.NET Frameworkを実装するクラスでステートメントを使用しないでください。このMSDN 記事では、サービス参照を使用するための正しいパターンについて説明しています。これは、から作成されたインスタンスにも適用されます。usingIDisposableChannelChannelFactory

于 2013-09-23T20:50:34.860 に答える
0

複数の呼び出しで同じプロキシを使用する

MyServiceClient proxy = new MyServiceClient();
proxy.Open();
proxy.Func1();

// Some other code

proxy.Func2();
proxy.Close();
于 2013-09-23T18:40:22.877 に答える
0

他の人がすでに述べたように、メソッドを呼び出した後のリソースの確定的な解放について心配する必要がありますが、メソッドで発生しClose()た場合、外部リソースは解放されません。ExceptionFunc1,2()

使用usingしてIDisposableパターン化することをお勧めします。つまり、サービス呼び出しを使用するたびに、次のようになります。

using(MyServiceClient proxy = new MyServiceClient())
{
    proxy.Func1();
}

これにより、ブレース内で問題が発生した場合でも、すべてのリソースが解放されることが保証されます。try, finallyまたは、これを組み合わせて手動で行うこともできます。

于 2013-09-23T19:21:08.033 に答える