2012-02-01 49 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