2017-04-21 131 views
-3

我創建的,從開發環境,多層次的ToolStripMenuItem堆棧中創建的線程以外的線程訪問。ToolStripMenuItem:跨線程操作無效:控制從比它是在

問題: 1)碼(下文)用於預先設置工具條項的值。有兩個ToolStripMenuitems,其中myItem.GetCurrentParent()。InvokeRequired不等於this.InvokeRequired。 GetCurrentParent.InvokeRequired產生正確的結果一個項目,this.InvokeRequired適用於其他。所有其他項目可以使用任一格式正常工作 2)如果我繞過預設過程,並且程序正在運行,我點擊頂層ToolStripMenuItem,程序就會通過「Cross-thread」消息崩潰。

詳情: 的形式和所有控件的形式從開發環境中創建。 Visual Studio創建一個啓動類,它通過「Application.Run(new cfrmParent());」靜態運行' 'InitializeComponent()設置我的所有控件沒有任何問題。 我用「public cfrmCommand CmdFrm = new cfrmCommand();」實例化表單 然後我有一個單獨的線程執行一個CmdFrm.ShowDialog以允許用戶操作控件(並允許其他外部進程更新窗體上的顯示)。當出現錯誤#2時,它會對ShowDialog命令執行此操作。

加載窗體時,我預設ToolStrip的菜單項。這是問題發生的地方。表單上的所有其他控件及其相關代碼都能正常工作。如果我刪除頂部ToolStripMenuItem中的所有子菜單項,則該項可正常工作。

懷疑: 我對問題的「猜測」是Visual Studio不能通過正確的線程檢查過程從上層菜單項訪問工具條項目。當我點擊頂級項目時,它會嘗試加載在不同線程上創建的較低級別的項目。

對我來說是正確的解決方案,只能創建,附加和編程預設的下一級菜單項上點擊時,上級的項目或有更好的方法來解決這個問題? 感謝您的幫助。

我的代碼,以預設的菜單項:

private void WriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string writeValue) 
{ 
    if (myItem.GetCurrentParent().InvokeRequired != this.InvokeRequired) 
    { 
     int myTest = 1;} 
    if (this.InvokeRequired) 
    { 
     this.Invoke(new dlgWriteMenuItem(ivkWriteMenuItem), myItem, writeValue);} 
    else 
    { 
     ivkWriteMenuItem(myItem, writeValue);} 
} 
private delegate void dlgWriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string writeValue); 
private void ivkWriteMenuItem(System.Windows.Forms.ToolStripMenuItem myItem, string myValue) 
{ 
    myItem.Checked = (myValue.Trim().ToUpper() == "TRUE"); 
} 

回答

0

嘗試:

this.Invoke(delegate 
{ 
    // Do work 
});