2011-09-07 30 views
0

所以,我發現網上迄今爲止關於調用屬性的文件似乎並不特別好,這實際上是有種令人討厭的,信不信由你。我瞭解Invoke的功能 - 您無法直接安全地訪問GUI,因此調用可以安全地進行。這很好,但我不明白進入該方法的變量。例如,如果我想要從列表框中刪除文本,我該怎麼做?在我有點迷路之前,我已經瞭解了這一點。刪除帶有調用的文本?

private void DoStuff(string TextIWouldBeRemoving) 
{   

if (listboxname.InvokeRequired) 
    { 
     listboxname.Invoke(SomeMysteriousParamaters, new object[] { TextIWouldBeRemoving)}; 
    } 
} 
+0

看到這個偉大的職位http://stackoverflow.com/questions/661561/how-to-update-gui-from-another-thread-in- C/661706#661706 – sll

+0

如果您使用的lambda表達式要容易得多。而且不需要InvokeRequired。 –

回答

0

第一個參數是要安全地調用該方法,第二個參數是arguments對象數組到方法

所以你可以這樣寫:

private void DoStuff(string TextIWouldBeRemoving) 
{   
    if (listboxname.InvokeRequired) 
    { 
     listboxname.Invoke(DoStuff, new object[] { TextIWouldBeRemoving)}; 
    } 
    else 
    { 
     // Actually remove the text here! 
    } 
} 
+0

我想補充:雖然我希望我寫的可以幫助你瞭解你問什麼,你寫了什麼,我與其他人同意,有線程管理的更好的方法,你應該考慮的BeginInvoke或lambda代表。你也應該看看Dispatcher,ThreadPool和(如果你需要並行執行的話)Parallel.Invoke。你可以看到一些答案,這種情況下[點擊這裏](http://stackoverflow.com/questions/7320491/simplest-way-to-run-three-methods-in-parallel-in-c) – Kevek

+0

Ohhhhh,我現在明白了。我沒有意識到它實際上會觸及「其他」聲明。是的,我可能會研究其他的東西,這只是一個快速的程序,我不得不爲了一個真正快速的人而拼湊在一起。感謝您的建議! – Kulahan

0

調用是所有關於線程。

你需要做的,只要你有你的代碼中創建一個單獨的線程一個調用,你需要從withing代碼更新的用戶界面元素,即在新創建的線程中執行。

可以使用的BeginInvoke,而不是同步調用方法。這篇文章有一個很好的例子:

http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx

0
private void button1_Click(object sender, EventArgs e) 
    { 
    if (listBox1.InvokeRequired) 
    { 
     Action<string> d = DoAnything; 
     listBox1.Invoke(d, new object[] { "Item 1" }); 
    } 
    else 
     DoAnything("Item 1"); 
    } 

    void DoAnything(string itemText) 
    { 
    listBox1.Items.Remove(itemText); 
    }