2016-06-30 12 views
9

ユニットテストで使用されるMockHttpListenerコールバックがあります。以下に示すように、私はそれにロックを追加しました:try内部でロックを使用するとパフォーマンスが低下する

public void HandleRequest(HttpListenerContext context) 
{ 
    try 
    { 
     lock (m_guard) 
     { 
      do something short; 
     } 

     do the actual handling (longer) 
    } 
    catch (HttpListenerException e) 
    { 
     ... 
    } 
    catch (Exception e) 
    { 
     ... 
    } 
    ... 
} 

を、私はテストが原因の添加前に、我々は(私はテストでこの問題が発生していない持っている判断基準「が長すぎるを取って」に失敗した問題が発生しました。ロック)

私は、問題を特定するために多くのことを試してみましたが、問題を修正しました唯一のものは、tryブロックの外にロックを取っていた。

public void HandleRequest(HttpListenerContext context) 
{ 
    lock (m_guard) 
    { 
     do something short; 
    } 
    try 
    { 
     do the actual handling (longer) 
    } 
    catch (HttpListenerException e) 
    { 
     ... 
    } 
    catch (Exception e) 
    { 
     ... 
    } 
    ... 
} 

行動の変化はその点では一致していますduratに影響を与えたtryブロックに相対的なロック位置イオンは、テストが完了するまでにかかりました。

理由は何ですか?

+2

このhttp://stackoverflow.com/questions/5997360/locking-a-resource-via-lock-within-try-is-it-wrongを読んでみてください。それはあなたになぜそれが起こるかのアイデアを与えるでしょう。 – hazevich

+0

@hazevichそれはあなたに*なぜ*遅いのかを教えてくれませんが、未処理の例外が決して 'lock'ブロックから逃げることを許してはいけないと伝えています*。物事をクリーンアップするには 'lock'ブロックの' try/finally'を使用する必要があります。しかし、それはここでOPを助けるものではありません。 –

+0

リンクのスレッドを読んでいますが、tryブロック内でロックを使用する正確性については説明しています。私はパフォーマンスの影響にのみ興味があります。すべての考慮のためのロックブロックは、以下のものだけで構成されていると考えることができます:m_some_member ++;他には何もないので、それ自体ではかなり安全です。 – shlomi

答えて

0

これはデッドロックのように聞こえます - 「何か短いコードを実行する」コードは、それ自体がロックをとるコードを呼び出しますか?

次のコードは正常に機能しますが、これは良い考えではありませんが、問題なく終了します。

class Program 
{ 
    static void Main(string[] args) 
    { 
     Locks.DoStuff(Enumerable.Range(0, 10000).Select(e => 9999 - e).ToList()); 
    } 
} 

static class Locks 
{ 
    public static void DoStuff(List<int> blah) 
    { 
     try 
     { 
      lock (blah) 
      { 
       for (var i = 0; i < blah.Count; i++) 
       { 
        blah[i] = 1000/blah[i]; 
       } 
      } 
     } 
     catch (DivideByZeroException e) 
     { 
      Trace.WriteLine("Exception - divided by zero"); 
     } 
    } 
} 
関連する問題