1)私はプロジェクトで作業していますが、このコードを見ましたが、Monitor.Lockステートメントのポイントは何か分かりません。誰かがしようとしていることを説明することはできますか?BeginUpdateとEndUpdateの実装
2)パラメータ名のポストスクリプトのアンダースキャンは実際には迷惑ですが、誰もこの命名規則を見ていますか?
public class FieldsChangeableHelper<T> : IFieldsChangeable<T>
{
object _lock;
int _lockCount;
FieldChanges<T> _changes;
public FieldsChangeableHelper()
{
_lock = new object();
_lockCount = 0;
}
public void AddChange(T field_, object oldValue_)
{
if (_changes == null)
_changes = new FieldChanges<T>(field_, oldValue_);
else
_changes.AddChange(field_, oldValue_);
if (RaiseEvent(_changes))
_changes = null;
}
#region IFieldsChangeable Members
public void BeginUpdate()
{
if (System.Threading.Interlocked.Increment(ref _lockCount) == 1)
Monitor.Enter(_lock);
}
public void EndUpdate()
{
if (System.Threading.Interlocked.Decrement(ref _lockCount) == 0)
{
FieldChanges<T> changes = _changes;
_changes = null;
Monitor.Exit(_lock);
RaiseEvent(changes);
}
}
protected bool RaiseEvent(FieldChanges<T> changes_)
{
if (_lockCount == 0 && Changed != null && changes_ != null)
{
Changed(this, changes_);
return true;
}
return false;
}
public event FieldsChanged<T> Changed;
#endregion
}
しかし、唯一の最初のスレッドがその System.Threading.Interlocked増加の背後にあるので、Monitor.Lockを呼び出します。これは、このような場合に役立ちますか? – Ant
@Ant - 私の答えは更新されました。これはバグであり、あなたが本当に何をやっているのか分からない限り、同期に関しては手動ではあまりやらなければならない良い理由です – Polity