5

私はこの方法でチャンネルの閉鎖と中止を処理してきました:

public async Task<MyDataContract> GetDataFromService()
{
    IClientChannel channel = null;
    try
    {
        IMyContract contract = factory.CreateChannel(address);
        MyDataContract returnValue = await player.GetMyDataAsync();
        channel = (IClientChannel);
        return returnValue;
    } 
    catch (CommunicationException)
    {
       // ex handling code
    } 
    finally
    {
        if (channel != null)
        {
            if (channel.State == CommunicationState.Faulted)
            {
                channel.Abort();
            }
            else
            {
                channel.Close();
            }
         }
    }
}

1 つのスレッドだけがチャネルを使用するとします。状態を確認した直後に、チャネルに障害が発生しないことをどのように確認できますか? そのようなことが起こった場合、コードは Close() を試行し、Close() は finally ブロックで例外をスローします。これが安全/安全ではない理由と、より安全でより良い方法の例についての説明をいただければ幸いです。

4

1 に答える 1

2

はい、状態は取得時の現在の状態の「スナップショット」です。CommunicationState にアクセスしてから、それに基づいて論理的な決定を下すまでの間に、状態が簡単に変化する可能性があります。より良い WCF パターンは次のとおりです。

try
{
    // Open connection
    proxy.Open();

    // Do your work with the open connection here...
}
finally
{
    try
    {
        proxy.Close();
    }
    catch
    {
        // Close failed
        proxy.Abort();
    }
}

このようにして、意思決定を行うために州に依存する必要はありません。最も可能性の高いこと (正常な終了) を実行しようとし、それが失敗した場合 (CommunicationState が Faulted の場合)、適切なクリーンアップを確実にするために Abort を呼び出します。

于 2013-06-04T23:37:05.600 に答える