2010-12-08 14 views
55

सी # में कक्षा असाइनमेंट पर काम करना, मैं किसी भी त्रुटि के बिना प्रोग्राम क्रैश में आया (VS2010 की डीबग विंडो में जो लिखा गया है) को छोड़कर। क्रैश के कारण सामान्य कोड यहां दिया गया है:सी #: "प्रकार का पहला मौका अपवाद 'System.InvalidOperationException'"

public partial class Test : Form 
{ 
    public Test() 
    { 
     InitializeComponent(); 
    } 

    private void Test_Load(object sender, EventArgs e) 
    { 
     ColumnHeader header; 

     header = new ColumnHeader(); 
     header.Text = "#"; 
     header.TextAlign = HorizontalAlignment.Center; 
     header.Width = 30; 
     listView1.Columns.Add(header); 

     TimerCallback tcb = this.UpdateListView; 

     System.Threading.Timer updateTimer = new System.Threading.Timer(tcb, null, 0, 1000); 
    } 

    public void UpdateListView(object obj) 
    { 
     ListViewItem item; 
     listView1.Items.Clear(); 

     for (int i = 0; i < 10; i++) 
     { 
      item = new ListViewItem(i.ToString()); 

      listView1.Items.Add(item); 
     } 

    } 
} 

... मुझे यहां क्या याद आ रही है?

** संपादित **

कोई त्रुटि है, इस कार्यक्रम सिर्फ समाप्त होता है आप को तोड़ने में Common Language Runtime Exception के लिए Thrown जाँच जब एक अपवाद हैं जैसे अगर मैं System.Environment.Exit(0);

A first chance exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll 
The program '[4644] ProgramTest.vshost.exe: Managed (v4.0.30319)' has exited with code 0 (0x0). 
The program '[4644] ProgramTest.vshost.exe: Program Trace' has exited with code 0 (0x0). 
+4

स्टैक ट्रेस? अपवाद फेंकने पर कोड की रेखा? –

उत्तर

150

कहेंगे खिड़की (Ctrl + Alt + विजुअल स्टूडियो में), तब अपवाद फेंकने पर निष्पादन को तोड़ना चाहिए जब आप अपवाद फेंकते हैं।

यह शायद आपको क्या हो रहा है में कुछ अंतर्दृष्टि देगा।

Example of the exceptions window

+1

नहीं! यहां तक ​​कि उस विकल्प के साथ कोई अपवाद नहीं फेंक दिया गया है और आईडीई –

+3

हाँ में कोई ब्रेक नहीं है! मैंने सभी "फेंक दिया" की जांच की और मुझे त्रुटि हो रही है जहां मैं नया आइटम जोड़ता हूं (मैंने थोड़ी देर पहले इसे संकुचित कर दिया है) और यह जवाब मिला: "क्रॉस-थ्रेड ऑपरेशन मान्य नहीं है: थ्रेड के अलावा किसी थ्रेड से 'कंट्रोल' सूची देखें ' यह बनाया गया था। " ... शॉर्टकट के लिए धन्यवाद। –

+1

@ मार्क एवेनियस - इससे मेरी समस्या को हल करने में भी मदद मिली - कभी नहीं पता कि विकल्प मौजूद है। बेहद सुविधाजनक। – Vidar

11

समस्या यहां है कि आपके टाइमर एक धागा शुरू होता है और जब यह कॉलबैक फ़ंक्शन, कॉलबैक फ़ंक्शन (updatelistview) चलाता है तो यह की this

क्योंकि नहीं किया जा सकता यूआई धागे पर नियंत्रण तक पहुँच रहा है है
0

एक जीयूआई अनुप्रयोग के लिए System.Threading.Timer के बजाय का उपयोग करने पर विचार करें, समर्पित थ्रेड या थ्रेड पूल के बजाय विंडोज संदेश कतार पर आधारित टाइमर के लिए।

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

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