在屏幕方法上显示多个线程数据

时间:2012-02-01 00:30:32

标签: c# wpf multithreading

我正在为我的硕士学位论文制作自己的爬虫。我想在运行监视时在屏幕上显示多个线程变量。我试过这种方法,但一段时间后屏幕变得没有反应。

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

好吧,即使有一段时间后有20个线程运行,这也会变得没有响应。因此,使用列表框似乎不是一种在屏幕上显示数据的好方法。我还能用什么呢?

C#4.0,WPF

3 个答案:

答案 0 :(得分: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";

答案 1 :(得分:1)

我不确定ListBox是否会导致问题。您正在UI线程上创建许多临时字符串。最佳做法是使用String.Format()。另外,在爬网线程上构建字符串。你也会在每次通话时都采取新行动。

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

答案 2 :(得分:0)

您最好的选择是使用任务计划程序并将数据封送回UI线程。