İlk olarak - çoğu sınıfın asla iş parçacığı için güvenli olması gerekmez. YAGNI kullanın : iplik güvenliğini yalnızca gerçekten kullanacağınızı bildiğinizde uygulayın (ve test edin).
Yöntem düzeyindeki şeyler için [MethodImpl]
:
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}
Bu aynı zamanda erişimcilerde de kullanılabilir (özellikler ve olaylar):
private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}
Alan benzeri olayların varsayılan olarak senkronize edildiğini, ancak otomatik olarak uygulanan özelliklerin olmadığını unutmayın :
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
Şahsen, MethodImpl
kilitlendiği gibi uygulanmasını sevmiyorum this
ya da typeof(Foo)
- en iyi uygulamaya karşı. Tercih edilen seçenek kendi kilitlerinizi kullanmaktır:
private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}
Alan benzeri olaylar için kilitleme uygulamasının derleyiciye bağlı olduğunu unutmayın; eski Microsoft derleyicilerinde bir lock(this)
/ lock(Type)
- ancak, daha yeni derleyicilerdeInterlocked
güncellemeler kullanır - bu yüzden kötü parçalar olmadan iş parçacığı için güvenlidir.
Bu, daha ayrıntılı kullanım sağlar ve iş parçacıkları arasında iletişim kurmak için Monitor.Wait
/ Monitor.Pulse
etc kullanımına izin verir .
Alakalı bir blog girişi (daha sonra tekrar ziyaret edilir ).