প্রথম - বেশিরভাগ শ্রেণীর কখনও থ্রেড-নিরাপদ হওয়ার দরকার পড়বে না। ইয়াগনি ব্যবহার করুন : কেবলমাত্র থ্রেড-সুরক্ষা প্রয়োগ করুন যখন আপনি জানেন যে আপনি আসলে এটি ব্যবহার করছেন (এবং এটি পরীক্ষা করুন)।
পদ্ধতি-স্তরের স্টাফগুলির জন্য, এখানে রয়েছে [MethodImpl]
:
[MethodImpl(MethodImplOptions.Synchronized)]
public void SomeMethod() {/* code */}
এটি অ্যাক্সেসরগুলিতে (বৈশিষ্ট্য এবং ইভেন্ট) ব্যবহার করা যেতে পারে:
private int i;
public int SomeProperty
{
[MethodImpl(MethodImplOptions.Synchronized)]
get { return i; }
[MethodImpl(MethodImplOptions.Synchronized)]
set { i = value; }
}
লক্ষ্য করুন ঘটনা মত ক্ষেত্র হয় , ডিফল্ট অনুসারে সিঙ্ক্রোনাইজ যখন স্বয়ং-বাস্তবায়িত বৈশিষ্ট্য নয় :
public int SomeProperty {get;set;} // not synchronized
public event EventHandler SomeEvent; // synchronized
ব্যক্তিগতভাবে, আমি বাস্তবায়ন পছন্দ না MethodImpl
এটা লক যেমন this
বা typeof(Foo)
যা সেরা প্রথার বিপরীতে নিজে -। পছন্দসই বিকল্পটি হল আপনার নিজের লকগুলি ব্যবহার করা:
private readonly object syncLock = new object();
public void SomeMethod() {
lock(syncLock) { /* code */ }
}
নোট করুন যে ক্ষেত্রের মতো ইভেন্টগুলির জন্য, লকিং বাস্তবায়ন সংকলকের উপর নির্ভরশীল; পুরানো মাইক্রোসফ্ট সংকলকগুলিতে এটি একটি lock(this)
/ lock(Type)
- তবে সাম্প্রতিক সংকলকগুলিতে এটিInterlocked
আপডেটগুলি ব্যবহার করে - সুতরাং দুষ্টু অংশগুলি ছাড়াই থ্রেড-নিরাপদ।
এটি আরও দানাদার ব্যবহারের অনুমতি দেয় এবং থ্রেডগুলির মধ্যে যোগাযোগের জন্য Monitor.Wait
/ Monitor.Pulse
ইত্যাদি ব্যবহারের অনুমতি দেয় ।
সম্পর্কিত ব্লগ এন্ট্রি (পরে পুনর্বিবেচিত )।