私はこのように見ているいくつかのコードがあります。System.Threading.Timerを使用して同期しないでください。
using System.Threading;
public sealed class MyClass : IDisposable {
private readonly Timer _timer;
public MyClass() {
_timer = new Timer(MyCallback);
}
public void SomeMethod() {
lock (_timer) {
...
}
}
...
}
私はコード解析(FxCopの)を実行すると、私は
CA2002 : Microsoft.Reliability : 'MyClass.SomeMethod' locks on a reference of type 'Timer'. Replace this with a lock against an object with strong-identity.
I found some documentation hereエラーメッセージが表示されますが。
オブジェクトは、アプリケーションドメインの境界を越えて直接アクセスできる場合、弱いアイデンティティを持つと言われています。
は、どのように私のプライベートタイマーオブジェクトは、AppDomainを越えてアクセスすることができますか?私が考えることができる唯一の理由は、Timerクラスがいくつかのグローバルシステムハンドルをラップする場合ですが、そのハンドルがロックにどのように関与しているのか分かりません。
ありドキュメントページ上の弱いクラスのリストですが、タイマーは言及されていません。 MemomoryStreamもリストにはありませんが、例に含まれています。ローカルのMemoryStreamオブジェクトはどのように弱いのですか?
感謝。私はそれを回避する方法を知っていますが、パブリックオブジェクトの潜在的なロックが問題である場合、なぜいくつかのクラスがリストされている理由を理解していません。 – adrianm
@adrianm:パブリックオブジェクトに対する潜在的なロックは一般的に問題です。 'MarshalByRefObject'をロックすることで、あるAppDomainで実行されているコードが別のAppDomainのオブジェクトをロックすることができるため、さらに問題が発生する可能性があります。 –
私の個人的なMarshalByRefObject自体が他のappdomainに見えるようになっている可能性がありますか?そうでなければ、他の誰がロックでそれを使うことができるのか分かりません。 – adrianm