因为我有一个工具需要在一个点上做很多工作,所以我想在工作时显示一个包含一些文本和进度条的窗口。
我的问题是,由于工作的巨大负担,窗口永远不会被绘制或更新。
我知道我通常应该使用额外的线程进行工作,但我必须使用2个集合和当前线程中的数据库服务。
当前代码类似于
StatusWindow SW = new StatusWindow();
StatusViewModel SVM = new StatusViewModel();
SVM.MaxNum = BigNumber;
SW.Show();
for (int i=0; i<BigNumber; i++)
{
List<AType> ItemsToCreate = Func1();
List<AType> ItemsToDelete = Func2();
foreach (AType cItem in ItemsToCreate)
DB.CreateItem(cItem);
foreach (AType cItem in ItemsToDelete)
DB:DeleteItem(cItem);
SVM.CurrentNum = i;
}
SW.Close();
我也读过Dispatcher,但我不认为它在这种情况下非常有用,因为对主线程的访问权限太多了。
有什么建议吗? 感谢
答案 0 :(得分:2)
我建议阅读MSDN杂志上的文章(Build More Responsive Apps With The Dispatcher),该文章介绍了在使用BackgroundWorker时WPF如何与Dispatcher配合使用。
答案 1 :(得分:1)
只要您正在访问的对象可以从不同的线程访问,您就可以将两个集合以及您想要的其他任何内容传递给工作线程。
int[] arrayofInt = new int[10]
ThreadPool.QueueUserWorkItem(s =>
{
//access the array in the worker thread
arrayofInt[0] = 10;
});
完成工作后,您需要向对话框发送一条消息,告知它现在应该关闭。通过在你的对话框处理的线程中触发一个事件来做到这一点。