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