我有一个这样的代码:http://pastie.org/1638879
我从别人的博客上看到的。它必须对大文件进行排序。我把它放在单独的线程中:
protected virtual void goButton_Clicked (object sender, System.EventArgs e)
{
FileSort fileSort = new FileSort(fileNameEntry.Text, "./BigFileSorted.dat");
fileSort.SplitProgressChanged += fileSortProgressSplitting;
fileSort.SortChunksProgressChanged += fileSortProgressSorting;
fileSort.MergeProgressChanged += fileSortProgressMerging;
Thread thread = new Thread(fileSort.Sort);
thread.Start();
//fileSort.Sort();
}
protected virtual void fileSortProgressSplitting(FileSort o, double progress)
{
progressBar.Fraction = progress;
progressBar.Text = "Splitting...";
}
protected virtual void fileSortProgressSorting(FileSort o, double progress)
{
progressBar.Fraction = progress;
progressBar.Text = "Sorting...";
}
protected virtual void fileSortProgressMerging(FileSort o, double progress)
{
progressBar.Fraction = progress;
progressBar.Text = "Merging...";
}对于小文件,一切正常,但对于大文件(大约4 gb),在拆分步骤中,progressBar会因为某些原因而停止。但是拆分已经完成了。这种奇怪的原因是什么?另外,我正在用Mono和Gtk#写这篇文章。
发布于 2011-03-06 18:19:31
与winforms类似,Gtk具有线程亲和性。你的更新应该发生在主UI循环上。您可以通过以下方式执行此操作:
protected virtual void fileSortProgressMerging(FileSort o, double progress) {
Gtk.Application.Invoke (delegate {
progressBar.Fraction = progress;
progressBar.Text = "Merging...";
});
}另请参阅有关这一点的mono Best Practices说明。
发布于 2011-03-06 18:18:23
您不能从非GUI线程接触GUI对象。结果是不可预测的。有时它会抛出异常,但并不总是如此。
相反,使用Invoke或BeginInvoke方法(前者更好)。如下所示:
protected virtual void fileSortProgressSplitting(FileSort o, double progress)
{
BeginInvoke( new Action( () =>
{
progressBar.Fraction = progress;
progressBar.Text = "Splitting...";
} );
}https://stackoverflow.com/questions/5209886
复制相似问题