2

私は物事をより簡単にしようとしています。これが私のコードです:

    If Threading.Monitor.TryEnter(syncRoot) Then
        Try
            'do something
        Finally
            Threading.Monitor.Exit(syncRoot)
        End Try
    Else
        'do something else
    End If

これは、ノイズの点で ReaderWriterLock よりもさらに悪いです。私は C# または VB を使用できるので、どちらにも当てはまる回答を歓迎します。

4

2 に答える 2

6

デリゲートを使用しますか?

例えば

public bool TryEnter(object lockObject, Action work) 
{
    if (Monitor.TryEnter(lockObject)) 
    {
       try 
       {
          work();
       }
       finally 
       {
           Monitor.Exit(lockObject);
       }        
       return true;
     }

     return false;
}
于 2008-10-04T10:31:55.510 に答える
4

これは前回の投稿と非常によく似ており、同様の回答が期待されます。唯一の重要な違いは、タイムアウトが失敗した場合にメソッドから「null」を返す可能性があることです。その場合、「Dispose()」は呼び出されず、値を簡単に確認できます。

using(var token = GetLock(syncLock, timeout)) {
  if(token != null) { ... }
}

唯一の実際の不具合は、必ずしも拡張メソッドを「オブジェクト」(または「T where T : class」) に追加する必要がないことです...

Jon Skeetはこれを過去に調べています。一見の価値があります

于 2008-10-04T09:37:04.340 に答える