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ブロックに相対的なロック位置イオンは、テストが完了するまでにかかりました。
理由は何ですか?
このhttp://stackoverflow.com/questions/5997360/locking-a-resource-via-lock-within-try-is-it-wrongを読んでみてください。それはあなたになぜそれが起こるかのアイデアを与えるでしょう。 – hazevich
@hazevichそれはあなたに*なぜ*遅いのかを教えてくれませんが、未処理の例外が決して 'lock'ブロックから逃げることを許してはいけないと伝えています*。物事をクリーンアップするには 'lock'ブロックの' try/finally'を使用する必要があります。しかし、それはここでOPを助けるものではありません。 –
リンクのスレッドを読んでいますが、tryブロック内でロックを使用する正確性については説明しています。私はパフォーマンスの影響にのみ興味があります。すべての考慮のためのロックブロックは、以下のものだけで構成されていると考えることができます:m_some_member ++;他には何もないので、それ自体ではかなり安全です。 – shlomi