2011-08-22 74 views
8

我想弄清楚是否有方法來調用ToolStripMenuItem。調用ToolStripMenuItem

例如,我調用Web服務(ASynchrously)時,結果是根據結果returned.i填入下拉項,(在回調方法)

ToolStripMenuItem.DropDownItems.Add(new ToolStripItemEx("start")); 

,但我得到異常

跨線程操作無效:控制從一個線程訪問,而不是線程創建線程。

有一個與工具條項目沒有關聯的調度功能, 有另一種方法,我可以做到這一點?我是否試圖以完全錯誤的方式做到這一點?任何輸入都會有幫助。

回答

17

您嘗試執行依賴於控制主線程在另一個線程代碼,你應該把它用Invoke方法:

toolStrip.Invoke(() => 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}); 

當訪問控制從一個線程是不同的線程成員/方法是最初創建的控件,你應該使用control.Invoke方法,它會將調用的代碼中的執行編組到主線程中。

編輯:由於您使用ToolStripMenuItemToolStrip,將ToolStripMenuItem沒有Invoke成員,所以您可以使用的形式通過「this.Invoke」或您toolStrip其父「ToolStrip」調用調用,所以:

toolStrip.GetCurrentParent().Invoke(() => 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}); 
+0

如何調用ToolStripMenuItem?該控件沒有調用方法? –

+0

我猜他知道這個......他只是找不到 – Carsten

+0

可汗如果你使用wpf你需要使用Dispatcher.Invoke' –

4

你正試圖從一個線程,而不是主線程訪問菜單項,所以嘗試這個代碼:

MethodInvoker method = delegate 
{ 
    toolStrip.DropDownItems.Add(new ToolStripItemEx("start")); 
}; 

if (ToolStripMenu.InvokeRequired) 
{ 
    BeginInvoke(method); 
} 
else 
{ 
    method.Invoke(); 
} 
+1

+1指出'InvokeRequired'和'BeginInvoke' –

相關問題