12

次の方法を使用して、WCF 4 チャネルを閉じています。これは正しい方法ですか?

using (IService channel 
    = CustomChannelFactory<IService>.CreateConfigurationChannel())
{
    channel.Open();

    //do stuff
}// channels disposes off??
4

2 に答える 2

25

これ、WCF の "初期" の時代に WCF クライアント プロキシをリリースする一般的に受け入れられた方法でした。

しかし、その後、状況は変わりました。IClientChannel<T>.Dispose()の実装は単にIClientChannel<T>.Close()メソッドを呼び出すだけであることが判明しました。これは、基になるチャネルが開いていない、またはできない場合など、一部の状況で例外をスローする可能性があります。適時に閉鎖すること。

したがって、例外が発生した場合に解放されていないリソースが残る可能性があるためClose()、ブロック内で呼び出すことはお勧めできません。catch

新しく推奨される方法は、失敗した場合に備えて、代わりにブロック内でIClientChannel<T>.Abort()を呼び出すことです。次に例を示します。catchClose()

try
{
    channel.DoSomething();
    channel.Close();
}
catch
{
    channel.Abort();
    throw;
}

アップデート:

この推奨事項について説明している MSDN の記事への参照を次に示します。

于 2012-01-30T12:37:26.047 に答える
8

チャネルに厳密に向けられているわけではありませんが、次のことができます。

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;
}
于 2012-01-30T10:01:18.130 に答える