非常に大きな winforms デスクトップ アプリケーションがあります。私たちのアプリケーションは時々デッドロックに陥りますが、これがどのように発生するのかわかりません。
これはロック操作が原因であることがわかっています。したがって、次のようなかなり多くのコード部分があります。
lock (_someObj)
DoThreadSaveOperation();
デッドロックの原因を検出できるようにするためのアプローチは、これらすべてのロック操作を次のようなものに変換する必要があります。
bool lockTaken = false;
var temp = _someObj;
try {
System.Threading.Monitor.TryEnter(temp, 1000, ref lockTaken);
if (!lockTaken)
{
// log "can't get lock, maybe deadlock, print stacktrace
}
DoThreadSaveOperation();
}
finally {
System.Threading.Monitor.Exit(temp);
}
この「ロックサービス」は中心的な位置にあるべきです。問題は、次のように呼び出す必要があることです。
LockService.RunWithLock(object objToLock, Action methodToRun);
つまり、ロック後に実行されるステートメントごとにデリゲート関数を作成する必要がありました。
これは多くのリファクタリングになるため、皆さんがこれについてより良い/良いアイデアを持っていて、意見を求めている場合は、stackoverflow を試してみようと思いました.
助けてくれてありがとう =)