2012-02-01 48 views
-2

我正在爲我的碩士學位論文製作自己的爬行器。我想在運行監視時在屏幕上顯示多個線程變量。我嘗試了這種方法,但過了一段時間屏幕變得無法響應。在屏幕上顯示多線程數據

this.Dispatcher.BeginInvoke(new Action(delegate() 
{ 
    listBox1.Items[irWhichMainTask] = srMainSiteId + " : " + srMainSiteURL + " : processed " + irLocalProcessedLinkCount + " : max thread count " + irLocalThreadCount + " : active thread count " + irActiveThreadCount; 
})); 

好吧,即使有20個線程在一段時間後運行,這個變得沒有反應。所以好像使用listbox不是在屏幕上顯示數據的好方法。我還能使用什麼?

C#4.0,WPF

+0

我會嘗試用同樣的事,爲前,RichTextBox中,看它是否是一個列表框問題 – 2012-02-01 00:38:20

+0

好吧讓我試試 – MonsterMMORPG 2012-02-01 00:40:27

+0

我檢查RichTextBox中,我看不出有什麼辦法讓它線爲主。我的意思是在列表框中,我總是編輯同一行,所以能夠跟隨線程。但richtextbox我沒有看到它。 – MonsterMMORPG 2012-02-01 00:43:20

回答

1

你可以嘗試爲你的線程狀態創造一個觀察的集合。然後將列表框綁定到此集合。

編輯:

// Define a data context 
public class MyContext 
{ 
    public ObservableCollection<string> Values { get; set; } 
} 

你可以在XAML下面,但我的WPF是有點生疏。我把這個放入表單加載。

// Create an instance of your context 
var myContext = new MyContext(); 
myContext.Values = new ObservableCollection<string>(); 

// Set up a binding between your collection and the 'Items' property of the listbox 
Binding b = new Binding(); 
b.Source = myContext; 
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged; 
b.Path = new PropertyPath("Values"); 
ListBox1.SetBinding(ListBox.ItemsSourceProperty, b); 

// Add values to the collection - these will automatically end up in the listbox 
myContext.Values.Add("New item"); 
myContext.Values.Add("Other new item"); 

// You can change values too 
myContext.Values[0] = "This has changed"; 
+0

可以請你提供更多的細節? – MonsterMMORPG 2012-02-01 02:17:10

+0

http://msdn.microsoft.com/en-us/library/ms668604.aspx 可觀察集合將在內容更改時觸發事件。這意味着當你將數據綁定到列表框時,你不需要擔心更新UI。只需更新這個集合,數據綁定就會處理剩下的事情。 – SynXsiS 2012-02-01 02:46:44

+0

感謝您的回答,但它給出了一個錯誤:這種類型的CollectionView不支持從與分派器線程不同的線程更改其SourceCollection。 – MonsterMMORPG 2012-02-01 22:37:28

0

你最好的選擇是使用任務計劃程序並將數據封送回UI線程。

+0

請詳細說明。我不明白這一點。 – MonsterMMORPG 2012-02-01 02:17:25

+0

這是一個鏈接。 http://blogs.msdn.com/b/csharpfaq/archive/2010/06/18/parallel-programming-task-schedulers-and-synchronization-context.aspx – tsells 2012-02-01 02:55:43

+0

這就是我正在做的。那篇文章有什麼不同?我也讀過那個。 – MonsterMMORPG 2012-02-01 02:59:21

1

我不確定ListBox是否導致問題。您正在UI線程上創建大量臨時字符串。最佳做法是使用String.Format()。另外,在爬行線程上構建字符串。您在每次通話時都會收到一個新的操作。

var status = String.Format("{0} : {1} : processed {2} ...", srMainSiteId, srMainSiteUrl, ...) 
this.Dispatcher.BeginInvoke((Action) delegate() 
    { 
    listBox1.Items[irWhichMainTask] = status; 
    }); 
+0

現在這個新的動作可能會影響。說新的行動或行動有什麼不同? – MonsterMMORPG 2012-02-01 02:45:19

+0

礦是隻是一個演員,以保持編譯器的快樂(沒有運行時間的懲罰)。你正在創建一個新的Action對象。另外,你對字符串的拼接真的是效率低下。 – 2012-02-01 02:50:14

+0

這串事情真的很重要嗎?由於臨時字符串,我從未看到任何性能問題。 – MonsterMMORPG 2012-02-01 02:52:06