これがポイントです。私はWCFサービスを持っています。それは現在機能しています。それで、私はクライアント側で働き始めます。そして、アプリケーションの実行中に、タイムアウトという例外が発生しました。接続を維持する方法については多くの例がありますが、チャネルを作成して使用し、破棄するのが最善の方法であることもわかりました。そして正直なところ、私はそれが好きでした。したがって、チャンネルを閉鎖する最善の方法について読んでいると、それらを必要とするすべての人に役立つ可能性のある2つのリンクがあります。
最初のリンクでは、これは例です:
IIdentityService _identitySvc;
...
if (_identitySvc != null)
{
((IClientChannel)_identitySvc).Close();
((IDisposable)_identitySvc).Dispose();
_identitySvc = null;
}
そのため、チャネルが null でない場合は、閉じて破棄し、null を割り当てます。しかし、少し質問があります。この例では、チャネルに .Close() メソッドがありますが、私の場合、インテリセンスは Close() メソッドを表示していません。ファクトリ オブジェクトにのみ存在します。だから書かなければならないと思っています。しかし、それを実装するコントラクトまたはクラスを持つインターフェイスでは??. そして、このメソッドは何をすべきですか??.
さて、次のリンクは、これまでに試したことのないものです。Func<T>
. そして、ゴールを読んだ後、それは非常に興味深いものです。ラムダを使用してチャネルを作成し、使用し、閉じて破棄する関数を作成します。Using()
この例では、その関数をステートメントのように実装しています。それは本当に良いことであり、優れた改善です。しかし、私は少し助けが必要です.正直なところ、私はその機能を理解することができないので、専門家からの少しの説明は非常に役に立ちます. これは機能です:
TReturn UseService<TChannel, TReturn>(Func<TChannel, TReturn> code)
{
var chanFactory = GetCachedFactory<TChannel>();
TChannel channel = chanFactory.CreateChannel();
bool error = true;
try {
TReturn result = code(channel);
((IClientChannel)channel).Close();
error = false;
return result;
}
finally {
if (error) {
((IClientChannel)channel).Abort();
}
}
}
そして、これはどのように使用されているかです:
int a = 1;
int b = 2;
int sum = UseService((ICalculator calc) => calc.Add(a, b));
Console.WriteLine(sum);
ええ、私は本当に、本当に良いと思います。私が持っているプロジェクトでそれを使用するためにそれを理解したいと思います.
そして、いつものように、これが多くの人に役立つことを願っています.