दिलचस्प पोस्ट
std :: cout प्रिंट नहीं होगा रूबी में एक पृष्ठभूमि की प्रक्रिया पैदा करें SQL सर्वर में एक डेटाबेस से दूसरे डेटाबेस को कॉपी करें एक हैशमैप के माध्यम से दोहराएं PresentModalViewController की तरह pushviewcontroller एनीमेशन दिखा रहा है बिगइंटेगर हेक्स / डीसीमल / ऑक्टल / बाइनरी स्ट्रिंग्स में? सी ++ में अतिरिक्त योग्यता त्रुटि जांचें कि संपादन टेक्स्ट खाली है या नहीं। बैक बटन पर टेक्स्ट कैसे बदलें इनसेट को समायोजित करने के लिए यूआईएलबल का आकार बदलना विंडोज फॉर्म पर एक एकल पिक्सेल ड्रॉ करें Sqlite3 मणि त्रुटि के कारण हेरोोक परिनियोजन विफल रहे OLEDB डेटा प्रदाता का उपयोग करते हुए Excel फ़ाइल पढ़ना संसाधन को स्टाइलशीट के रूप में व्याख्या की गई लेकिन माइम प्रकार पाठ / html (वेब ​​सर्वर से संबंधित नहीं लगता है) के साथ स्थानांतरित किया गया क्यों KML डेटा का उपयोग कर एंड्रॉइड के लिए Google दिशाएं फिर से काम नहीं कर रही हैं?

संग्रह संशोधित किया गया था; गणना कार्य निष्पादित नहीं हो सकता है

मैं इस त्रुटि के नीचे नहीं जा सकता, क्योंकि जब डीबगर संलग्न होता है, तो ऐसा प्रतीत नहीं होता है। नीचे कोड है

यह विंडोज सर्विस में डब्लूसीएफ सर्वर है I जब भी कोई डेटा इवेंट (यादृच्छिक अंतराल पर है, लेकिन अक्सर नहीं – – प्रति दिन लगभग 800 बार) अधिसूचनासूचकियों को विधि द्वारा बुलाया जाता है।

जब कोई Windows प्रपत्र क्लाइंट सदस्यता लेता है, तो ग्राहक आईडी सदस्यतादाता शब्दकोश में जोड़ दी जाती है, और जब ग्राहक सदस्यता समाप्त कर देता है, तो इसे शब्दकोश से हटा दिया जाता है त्रुटि तब होती है जब ग्राहक (ग्राहक) का त्याग करते हैं। ऐसा प्रतीत होता है कि अगली बार NotifySubscribers () विधि को बुलाया जाता है, तो foreach () लूप विषय पंक्ति में त्रुटि के साथ विफल रहता है विधि कोड में दिखाए गए अनुसार त्रुटि में एप्लिकेशन लॉग में लिखती है। जब कोई डीबगर जुड़ा होता है और एक ग्राहक सदस्यता समाप्त करता है, तो कोड ठीक निष्पादित होता है

क्या आप इस कोड के साथ एक समस्या देखते हैं? क्या मुझे ड्रेसर को सुरक्षित बनाने की आवश्यकता है?

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)] public class SubscriptionServer : ISubscriptionServer { private static IDictionary<Guid, Subscriber> subscribers; public SubscriptionServer() { subscribers = new Dictionary<Guid, Subscriber>(); } public void NotifySubscribers(DataRecord sr) { foreach(Subscriber s in subscribers.Values) { try { s.Callback.SignalData(sr); } catch (Exception e) { DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error); UnsubscribeEvent(s.ClientId); } } } public Guid SubscribeEvent(string clientDescription) { Subscriber subscriber = new Subscriber(); subscriber.Callback = OperationContext.Current. GetCallbackChannel<IDCSCallback>(); subscribers.Add(subscriber.ClientId, subscriber); return subscriber.ClientId; } public void UnsubscribeEvent(Guid clientId) { try { subscribers.Remove(clientId); } catch(Exception e) { System.Diagnostics.Debug.WriteLine("Unsubscribe Error " + e.Message); } } } 

Solutions Collecting From Web of "संग्रह संशोधित किया गया था; गणना कार्य निष्पादित नहीं हो सकता है"

संभवतः क्या हो रहा है कि सिग्नलडेटा, अप्रत्यक्ष रूप से ग्राहकों के शब्दकोश को पाश के दौरान हुड के नीचे बदल रहा है और उस संदेश की ओर अग्रसर है। आप बदलकर इसे सत्यापित कर सकते हैं

 foreach(Subscriber s in subscribers.Values) 

सेवा मेरे

 foreach(Subscriber s in subscribers.Values.ToList()) 

अगर मैं सही हूँ, तो समस्या गायब हो जाएगी

जब कोई ग्राहक सदस्यता समाप्त कर देता है तो आप गणक के दौरान सब्सक्राइबरों के संग्रह की सामग्री बदल रहे हैं।

इसे ठीक करने के कई तरीके हैं, एक लूप के लिए एक स्पष्ट उपयोग करने के लिए बदल रहा है .ToList() :

 public void NotifySubscribers(DataRecord sr) { foreach(Subscriber s in subscribers.Values.ToList()) { ^^^^^^^^^ ... 

एक और अधिक कुशल तरीके से, मेरी राय में, एक और सूची है कि आप यह घोषणा करते हैं कि आपने जो कुछ भी "हटाया जाना है" उसमें डाल दिया है फिर अपने मुख्य लूप को समाप्त करने के बाद (.toList () के बिना), आप "हटाए जाने के लिए" सूची पर एक और लूप करते हैं, प्रत्येक प्रविष्टि को ऐसा होने से हटाते हैं। तो अपनी कक्षा में आप जोड़ते हैं:

 private List<Guid> toBeRemoved = new List<Guid>(); 

फिर आप उसे इसमें बदल सकते हैं:

 public void NotifySubscribers(DataRecord sr) { toBeRemoved.Clear(); ...your unchanged code skipped... foreach ( Guid clientId in toBeRemoved ) { try { subscribers.Remove(clientId); } catch(Exception e) { System.Diagnostics.Debug.WriteLine("Unsubscribe Error " + e.Message); } } } ...your unchanged code skipped... public void UnsubscribeEvent(Guid clientId) { toBeRemoved.Add( clientId ); } 

यह केवल आपकी समस्या को हल नहीं करेगा, यह आपको अपने शब्दकोश से एक सूची बनाते रहने से रोक देगा, जो महँगी है अगर वहाँ बहुत से सदस्य हैं किसी भी पुनरावृत्ति पर निकाले जाने वाले ग्राहकों की सूची मानते हुए सूची में कुल संख्या से कम है, यह तेजी से होना चाहिए। लेकिन ज़ाहिर है कि यह निश्चित रूप से प्रोफ़ाइल के लिए नि: शुल्क लगता है कि मामले में अगर आपकी विशिष्ट उपयोग की स्थिति में कोई शक नहीं है।

आप अपने सब्सक्राइबर डिक्शनरी को तब भी रोका जा सकते हैं जब इसे रोका जा रहा है जब इसे संशोधित किया जा सके:

  lock (subscribers) { foreach (var subscriber in subscribers) { //do something } } 

नोट : सामान्य तौर पर। नेट संग्रह एक ही समय में एन्युमरेटेड और संशोधित होने का समर्थन नहीं करता है। यदि आप संग्रह सूची को संशोधित करने की कोशिश करते हैं, जब आप इसे एन्यूमरेट करने के बीच में होते हैं तो यह एक अपवाद बढ़ाएगा।

तो इस त्रुटि के पीछे समस्या यह है, हम सूची / शब्दकोश को संशोधित नहीं कर सकते हैं, जब तक कि हम इसके माध्यम से पाशन कर रहे हैं। लेकिन अगर हम अपनी चाबियों की एक अस्थायी सूची का प्रयोग करके एक शब्दकोश को पुनरावृत्त करते हैं, तो समानांतर में हम शब्दकोश वस्तु को संशोधित कर सकते हैं, क्योंकि अब हम शब्दकोश (और उसके प्रमुख संग्रह को पुनरावृत्त नहीं करने के लिए) पुनरावृति नहीं कर रहे हैं।

नमूना:

 //get key collection from dictionary into a list to loop through List<int> keys = new List<int>(Dictionary.Keys); // iterating key collection using simple for-each loop foreach (int key in keys) { // Now we can perform any modification with values of dictionary. Dictionary[key] = Dictionary[key] - 1; } 

यहां इस समाधान के बारे में एक ब्लॉग पोस्ट है

और स्टैक ओवरफ्लो में एक गहरे गोता लगाने के लिए: यह त्रुटि क्यों होती है?

असल में समस्या यह है कि आप सूची से तत्वों को निकाल रहे हैं और सूची को पढ़ना जारी रखने की उम्मीद कर रहे हैं जैसे कि कुछ नहीं हुआ है

आपको वास्तव में क्या करने की ज़रूरत है अंत से और शुरुआती ओर से शुरू करना। यहां तक ​​कि अगर आप सूची से तत्वों को हटा दें तो आप इसे पढ़ना जारी रख सकेंगे।

अमान्यऑपरेशन अपवाद- एक अमान्यऑपरेशन अपवाद हुआ है। यह एक foreach-loop में "संग्रह संशोधित किया गया" की रिपोर्ट करता है

ब्रेक स्टेटमेंट का प्रयोग करें, ऑब्जेक्ट हटा दिए जाने के बाद

उदाहरण के लिए:

 ArrayList list = new ArrayList(); foreach (var item in list) { if(condition) { list.remove(item); break; } } 

मेरे पास एक ही समस्या थी, और जब मैंने "फॉर" लूप का इस्तेमाल किया, तो इसके बजाय फॉरचाव का हल किया गया था

  for (int i = 0; i < itemsToBeLast.Count; i++) //foreach (var item in itemsToBeLast) { var matchingItem = itemsToBeLast.FirstOrDefault(item => item.Detach); if (matchingItem != null) { itemsToBeLast.Remove(matchingItem); continue; } allItems.Add(itemsToBeLast[i]);// (attachDetachItem); } 

मैंने इसके लिए कई विकल्प देखे हैं लेकिन मेरे लिए यह सबसे अच्छा था।

 ListItemCollection collection = new ListItemCollection(); foreach (ListItem item in ListBox1.Items) { if (item.Selected) collection.Add(item); } 

तो बस संग्रह के माध्यम से पाश।

आप एक समान प्रकार के अस्थायी ऑब्जेक्ट के लिए ग्राहकों को डिक्शनरी ऑब्जेक्ट कॉपी कर सकते हैं और फिर तेज़ लूप का प्रयोग करके अस्थायी शब्दकोष ऑब्जेक्ट को पुनरावृति कर सकते हैं।

तो इस समस्या को सुलझाने का एक अलग तरीका तत्वों को हटाने के बजाय एक नया शब्दकोश बनाएं और केवल उन तत्वों को जोड़ दें जिन्हें आप हटाना नहीं चाहते हैं, तो नए शब्दकोश के साथ मूल शब्दकोश की जगह दें। मुझे नहीं लगता है कि यह एक दक्षता समस्या की बहुत अधिक है क्योंकि यह संरचना के अनुसार बार बार पुनरावृत्त करता है।