2011-09-03 20 views
5

अरे मेरे पास एक UserControl है जो मेरे विजुअल स्टूडियो को क्रैश कर रहा है। तो मैं वी.एस. का एक और उदाहरण भाग गया और अन्य बनाम डिबग और यह मैं क्या सोचा है:विजुअल स्टूडियो क्रैश! - गणना के बाद संशोधित किया गया था

Collection was modified after the enumerator was instantiated. 

यहाँ मेरी सरणी है: यहाँ

private static Color[] colors = 
    { 
     Color.FromArgb(155, 188, 255), // 40000 
     Color.FromArgb(156, 189, 255), // 39500 
     Color.FromArgb(157, 188, 255), // 39000 
     Color.FromArgb(156, 189, 254), // 38500 
    }; 

और मेरे पाश कि bussines दुर्घटनाओं है

public Heater() 
    { 
     InitializeComponent(); 
     this.tarTemp = this.curTemp; 
     new Thread(() => UpdateTemp(true)).Start(); 
    } 

    private delegate void UpdateTempDelegate(bool loop); 
    private void UpdateTemp(bool loop) 
    { 
     if (lblTemp.InvokeRequired) 
     { 
      UpdateTempDelegate del = new UpdateTempDelegate(UpdateTemp); 
      lblTemp.Invoke(del, loop); 
     } 
     else 
     { 
      do 
      { 
       lblTemp.Text = curTemp + C; 
       if (curTemp >= 0) 
       { 
        int i = curTemp - 10; 
        if (i < 0) 
         i = 0; 
        if (i > colors.Length - 1) 
         i = colors.Length - 1; 
        this.BackColor = colors[i]; // I'M CRASHING !!! 
       } 
      } while (loop && !this.Disposing); 
     } 
    } 

लाइन है कि दृश्य स्टूडियो डिजाइनर दुर्घटनाओं this.BackColor = colors[i];

है

Application: devenv.exe 
Framework Version: v4.0.30319 
Description: The process was terminated due to an unhandled exception. 
Exception Info: System.InvalidOperationException 
Stack: 
    at System.ThrowHelper.ThrowInvalidOperationException(System.ExceptionResource) 
    at System.Collections.Generic.SortedList`2+SortedListValueEnumerator[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.__Canon, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]].MoveNext() 
    at Microsoft.VisualStudio.Shell.ServiceProviderHierarchy.GetService(System.Type) 
    at System.ComponentModel.Design.ServiceContainer.GetService(System.Type) 
    at System.ComponentModel.Design.DesignerHost.GetService(System.Type) 
    at System.ComponentModel.Design.DesignerHost+Site.System.IServiceProvider.GetService(System.Type) 
    at System.Windows.Forms.Control.get_AmbientPropertiesService() 
    at System.Windows.Forms.Control.get_BackColor() 
    at System.Windows.Forms.Control.set_BackColor(System.Drawing.Color) 
    at Multiplier.Heater.UpdateTemp(Boolean) 
    at Multiplier.Heater.<.ctor>b__0() 
    at System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 
    at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) 
    at System.Threading.ThreadHelper.ThreadStart() 
:

Threads

सभी थ्रेड एक ही लाइन पर बंद कर दिया ... this.BackColor = colors[i];

यहाँ EventViewer क्रैश लॉग है:

यहाँ चल धागे की छवि है

यह अब तक का सबसे अजीब बात है। सहायता की सराहना की जानी चाहिए।

उत्तर

3

जैसा कि आपने पाया, आपका कोड डिजाइनर को क्रैश कर रहा है, इसके साथ वीएस ले रहा है। समस्या यह है कि आप डिजाइन मोड में एक थ्रेड शुरू करते हैं, जो आपके कुछ कोड को डिज़ाइन समय पर चलाते हुए डिज़ाइनर द्वारा ट्रिगर किया जाता है। उदाहरण के लिए यह कन्स्ट्रक्टर, लोड इवेंट, ऑनहैंडलक्रेटेड, इत्यादि चलाएगा। यह एक बहुत अच्छा डिजाइन-टाइम अनुभव बनाता है, आपका नियंत्रण रनटाइम पर जैसा दिखता है।

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

public Heater() 
{ 
    InitializeComponent(); 
    this.tarTemp = this.curTemp; 
    if (!this.DesignMode) { 
     new Thread(() => UpdateTemp(true)).Start(); 
    } 
} 

आपको और अधिक काम करने की आवश्यकता होगी, यह कोड रनटाइम पर भी अच्छा काम नहीं करेगा। थ्रेडेड कोड बम होगा जब उपयोगकर्ता नियंत्रण पर रखा गया फॉर्म बंद है। एक बार जब आप इसे ठीक कर लेंगे, तो बाधाएं अच्छी हैं कि अब यह डिज़ाइन-टाइम पर भी सही तरीके से काम करती है। लेकिन मत करो।

+0

आप करीब थे: पी थ्रेड सृजन को रखकर! डिजाइनमोड बैरक्स एकमात्र चीज नहीं थी जिसे मैंने जबकि लूप रखा और यह काम किया :) Thx! – Danpe

0

क्या आप किसी अन्य कोड का उपयोग कर संग्रह को संशोधित कर रहे हैं? आमतौर पर ऐसा होता है जब आप एक लूप में संग्रह की गणना कर रहे हैं और आप संग्रह को संशोधित करने का प्रयास करते हैं।

+0

कुछ भी संशोधित नहीं कर रहा है ... मेरे पास कुछ थ्रेड चलाने वाले कुछ उपयोगकर्ता नियंत्रण हैं, शायद यह धागे के साथ कुछ है? – Danpe

संबंधित मुद्दे

 संबंधित मुद्दे