2011-02-09 70 views
2

嗨 我打開這樣的形式從我的主窗體中,當用戶選擇一個菜單項。我只能關閉表單一次,InvalidOperation異常Invoke或BeginInvoke不能在控件上調用,直到窗口句柄被創建

private void commToolStripMenuItem_Click(object sender, EventArgs e) 
     { 
      Command_Form Command_Form1 = new Command_Form(); 
      Command_Form1.ShowDialog(); 
      // Command_Form1.Dispose(); this didn't help 
     } 

形式「Command_Form1」 我關閉它這樣當用戶點擊關閉按鈕裏面

private void Close_button_Click(object sender, EventArgs e) 
     { 
      this.Close(); //I get the exception here 
     } 

這個過程正常工作一次,但在形式 的第二封閉(這我希望是一個完全不同的/新形式的實例)我得到這篇文章標題中的錯誤。 這是調試窗口中的輸出。

「System.InvalidOperationException」類型的第一次機會異常出現在System.Windows.Forms.dll中

所有在名單上這個錯誤去沒有試圖做任何事情,有一個表格的主題沒有被顯示,但是當我點擊表單上的按鈕時會發生這種情況。 在我看來,幾乎可以確保表單已經顯示,如果我能夠點擊它的按鈕。

其他職位我發現列出這種類型的錯誤繼續關於進行線程安全調用,所以我嘗試了這個作爲一個實驗,但它沒有任何區別。

private void Close_button_Click(object sender, EventArgs e) 
      { 
    if (this.InvokeRequired) 
       { 
        CloseCallback d = new CloseCallback(Close_button_Click); 
        Invoke(d, new object[] { sender, e }); 
       } 
       else 
       { 
        this.Close(); 

我在我的應用程序中有多個線程,但它們是由我明確使用的控件創建的。 我通過一個委託[Marshall]接收/發送的數據將串行數據從/傳遞到表單。 它是有道理的,串行端口將運行在不同的線程上,而不是窗體,但爲什麼按鈕單擊表單是在一個不同的線程比形式?????

整個線程的事情是非常困惑 如何找出什麼線程來自哪裏,以及我沒有明確創建的線程中發生了什麼? 爲什麼我需要通過委託來調用窗體的close方法? 在這個線程安全的多線程環境中,有什麼我可以做的事情我怎麼知道我在做什麼是不安全/安全的,如果我不知道什麼/哪裏/爲什麼/誰/什麼時候創建線程?

+0

可能重複[我只能關閉窗體一次,InvalidOperation異常Invoke或BeginInvoke不能在控件上調用,直到窗口句柄被創建](http://stackoverflow.com/questions/4959502/i-can -only-close-a-form-once-invalidoperation-exception-invoke-or-begininvoke-ca) – 2011-02-10 20:36:57

回答

0

我的猜測是你的close()調用不是拋出這個異常,而是在close()之後發生的事情。你有沒有用調試器加入代碼來看它何時被觸發?

至於何時需要調用......只有一個線程允許在GUI上進行更改和訪問動態屬性,稱之爲GUI線程。 GUI線程負責更新佈局,觸發按鈕等事件。如果您從另一個線程(如計時器事件)訪問GUI,則需要使用invoke()將您的函數排隊以在GUI線程上運行。 BeginInvoke也會對函數進行排隊,但是是異步的(只會排隊要在GUI線程上運行的函數,但不會等待它完成)。

Close_button_click只有在按鈕點擊事件觸發時纔會由你的gui線程調用(除非你明確地在你的代碼中的其他地方顯式調用它,不推薦!),所以在你的代碼中invokeRequired = false,並且調用代碼永遠不會執行。

+0

嗨SoggerI不得不安裝VS 2010以獲得加入代碼的選項,但作爲一個新手我過度了,但是什麼是繼續。我也在 – user593082 2011-02-10 15:36:11

相關問題