कहो मैं इस समारोह के साथ एक कोड ब्लॉक में प्रवेश (मान मैं एक threadsafe तरह से कैश तक पहुँचने हूँ):दो धागे रोकें एक ही मूल्य
object GetCachedValue(string id)
{
if (!Cache.ContainsKey(id))
{
//long running operation to fetch the value for id
object value = GetTheValueForId(id);
Cache.Add(id, value);
}
return Cache[id];
}
मैं "चलने से दो धागे को रोकने के लिए चाहते हैं लंबे समय तक चलने वाला ऑपरेशन "उसी समय उसी मान के लिए। जाहिर है, मैं पूरी चीज को लॉक() में लपेट सकता हूं, लेकिन फिर पूरा कार्य मूल्य के बावजूद ब्लॉक करेगा और मैं चाहता हूं कि दो धागे लंबे समय तक चलने वाले ऑपरेशन को करने में सक्षम हों, जब तक कि वे अलग-अलग आईडी की तलाश में हों।
वहाँ जबकि अन्य धागा लंबी चलने आपरेशन तो मैं दो बार (या एन बार) यह करने के लिए की जरूरत नहीं है पूरा करता है एक अंतर्निहित तंत्र ताला लगा एक मूल्य के आधार पर लॉक करने तो एक धागा ब्लॉक कर सकते हैं है? आदर्श रूप से जब तक लंबे समय तक चलने वाला ऑपरेशन एक थ्रेड में किया जा रहा है, तो कोई अन्य थ्रेड उसी आईडी मान के लिए ऐसा करने में सक्षम नहीं होना चाहिए।
मैं आईडी को हैशसेट में डालकर और फिर ऑपरेशन पूरा होने के बाद उन्हें हटाकर अपना खुद का रोल कर सकता हूं, लेकिन यह एक हैक जैसा लगता है।
आप String.Intern (आईडी) पर एक ताला कर सकता है। लेकिन फिर आपको यह सुनिश्चित करना चाहिए कि आपका "आईडी" स्ट्रिंग आपके ऐप में बहुत (!) अद्वितीय है;) – igrimpe