2011-06-16 47 views
0

即時通訊使用文本框,並需要替換文本框中的文本。問題是我需要更換718個不同的物品。我想把每個替換放到它自己的線程中來加快這個過程,但是當我這樣做時,它永遠不會取代它。TextBox.Text.Replace()MultiThreading

我曾嘗試類似以下

foreach (Match m in matchCollection) 
{ 
ReplaceClass r = new ReplaceClass(TextBox,m,ReplaceText) 
Thread th = new Thread(new ThreadStart(r.Replace)) 
th.start() 
} 
+0

我沒有看到'th.Start()'。另外什麼是ReplaceClass的樣子? – 2011-06-16 04:03:11

+4

718線程純粹是壞主意 – Dyppl 2011-06-16 04:10:37

+1

我建議不要操縱TextBox。從「TextBox」獲取「Text」字符串,完成所有替換,然後將結果字符串分配給文本框。你不應該從非UI線程訪問UI元素。 – 2011-06-16 04:11:31

回答

1

由於Dyppl在評論中寫道,您只能從宣佈並且正在運行的線程訪問表單。 我認爲,如果你想加快這個過程,不要替換文本框中的文本,而只是複製臨時字符串中的文本,修改它(替換匹配項),然後覆蓋表單中的文本。 所以

string text = TextBox.Text 
foreach (Match m in matchCollection) 
{ 
    text = somereplacement(m,replacetext); 

} 
TextBox.Text = text; 

編輯: 正如安東尼Pegram說,這不是很好的操控循環內以這樣的方式爲字符串,因爲該字符串被創建的每個時間,但我不知道你的替換功能不。更好的方法可能是

StringBuilder text = new StringBuilder(TextBox.Text); 
foreach (Match m in matchCollection) 
{ 
    //do something 
    . 
    . 
    . 
    text.Replace(toreplace ,replacement); 

} 
TextBox.Text = text.toString(); 

或者您也可以使用函數來搜索和替換正則表達式。只是不要在文本框中進行替換,因爲每次進行替換時都必須再次繪製控件。

+0

你真的不想在循環中操作'string'。你能想到一個更好的方式來執行操作? – 2011-06-16 04:39:27

+0

@ N4rk0,'StringBuilder'是我希望你會提到的。它是專門爲操縱字符串而建立的類,特別是當您在循環內發生這種操作時。 (小批量,直接對'string'工作是絕對沒問題的。) – 2011-06-16 04:57:07

+0

是的,但是當我們構建一個避免使用+ =運算符的字符串時,StringBuilder非常有用。在這裏,我們不需要構建字符串,只需要替換一些部分。我認爲字符串類的成員函數對於這個taks很有用。我錯了嗎? – N4rk0 2011-06-16 05:00:52

0

多線程不會真正幫助你在這裏,因爲你不能有所有這些線程訪問相同的字符串替換的東西,並創建所有的開銷這些線程無論如何都會超過任何好處 - 您的計算機沒有718核心CPU!

你最好不要使用多線程。請記住,除非字符串很大,否則718替換操作實際上可能並不會很慢。

只需執行無線程替換操作 - 如果要將線程添加到您的應用程序中,請查找需要幾秒鐘的操作,並且這些操作都不涉及整個操作的相同變量。

相關問題