2012-10-08 39 views
1

我知道如何做一個已經定義的文本框上的線程安全更新http://msdn.microsoft.com/en-us/library/ms171728.aspx ....我怎麼能這樣做的文本框,後來生成在程序?你的建議非常感謝。C#線程安全文本更新動態創建的文本框

+4

你會這樣做。哪一部分給你帶來麻煩? – cdhowie

+0

問題中的文本框對於每個線程都是不同的。我如何告訴它下一個方框而不將其名稱傳入參數? – user1261710

+0

當你說「下一個是哪個盒子」時,這意味着什麼?你暗示着你沒有告訴我們任何事情的某種秩序。更確切地說:**最好假裝我們不知道你在說什麼,並且準確地解釋你在做什麼。** – Kiril

回答

3

鑑於一些TextBox對象,只是調用它:

TextBox foo = new TextBox(...); 

// Code to add the new box to the form has been omitted; presumably 
// you do this already. 

Action update = delegate { foo.Text = "Changed!"; }; 

if (foo.InvokeRequired) { 
    foo.Invoke(update); 
} else { 
    update(); 
} 

如果你使用這個模式很多,這種擴展方法可能會有所幫助:

public static void AutoInvoke(
    this System.ComponentModel.ISynchronizeInvoke self, 
    Action action) 
{ 
    if (self == null) throw new ArgumentNullException("self"); 
    if (action == null) throw new ArgumentNullException("action"); 

    if (self.InvokeRequired) { 
     self.Invoke(action); 
    } else { 
     action(); 
    } 
} 

然後你就可以減少你的代碼爲:

foo.AutoInvoke(() => foo.Text = "Changed!"); 

這樣做只會做正確的事情,在ma上執行委託在GUI線程中是否正在執行它。

+0

嘿,這很酷。我也可以通過其中的幾個循環。 – user1261710

+0

太棒了....我真的需要現在瞭解lambda表示法 – user1261710

+0

您也可以使用匿名代表。在這種情況下,他們編譯到完全相同的東西。 (Lambdas可用於實例化表達式樹對象,而匿名代表則不能。兩者都可用於實例化委託對象,並且在這方面完全相同。) – cdhowie

0

我們在這裏肯定需要更多的信息,但從我能收集到的信息來看,你感嘆這個線程的主要功能沒有任何參數。您可以創建周圍類的文本框成員,並以這種方式訪問​​它們。如果你走這條路線,一定要使用一個互斥或其他鎖定設備的線程。

+0

基本上,用戶將輸入x個線程...文本框是在每個線程的表單上動態創建 – user1261710

+0

每個線程都有一個計數器循環,當計時器關閉時它將退出。用戶也將選擇時間。線程在同一時間運行,並將同時退出。 – user1261710

+0

感謝您對此問題的意見。 – user1261710