次の方法を使用して、WCF 4 チャネルを閉じています。これは正しい方法ですか?
using (IService channel
= CustomChannelFactory<IService>.CreateConfigurationChannel())
{
channel.Open();
//do stuff
}// channels disposes off??
次の方法を使用して、WCF 4 チャネルを閉じています。これは正しい方法ですか?
using (IService channel
= CustomChannelFactory<IService>.CreateConfigurationChannel())
{
channel.Open();
//do stuff
}// channels disposes off??
これは、WCF の "初期" の時代に WCF クライアント プロキシをリリースする一般的に受け入れられた方法でした。
しかし、その後、状況は変わりました。IClientChannel<T>.Dispose()の実装は単にIClientChannel<T>.Close()メソッドを呼び出すだけであることが判明しました。これは、基になるチャネルが開いていない、またはできない場合など、一部の状況で例外をスローする可能性があります。適時に閉鎖すること。
したがって、例外が発生した場合に解放されていないリソースが残る可能性があるためClose()
、ブロック内で呼び出すことはお勧めできません。catch
新しく推奨される方法は、失敗した場合に備えて、代わりにブロック内でIClientChannel<T>.Abort()を呼び出すことです。次に例を示します。catch
Close()
try
{
channel.DoSomething();
channel.Close();
}
catch
{
channel.Abort();
throw;
}
アップデート:
この推奨事項について説明している MSDN の記事への参照を次に示します。
チャネルに厳密に向けられているわけではありませんが、次のことができます。
ChannelFactory<IMyService> channelFactory = null;
try
{
channelFactory =
new ChannelFactory<IMyService>();
channelFactory.Open();
// Do work...
channelFactory.Close();
}
catch (CommunicationException)
{
if (channelFactory != null)
{
channelFactory.Abort();
}
}
catch (TimeoutException)
{
if (channelFactory != null)
{
channelFactory.Abort();
}
}
catch (Exception)
{
if (channelFactory != null)
{
channelFactory.Abort();
}
throw;
}