在工作时显示带有进度条的窗口

时间:2010-09-30 13:05:46

标签: wpf multithreading


因为我有一个工具需要在一个点上做很多工作,所以我想在工作时显示一个包含一些文本和进度条的窗口。

我的问题是,由于工作的巨大负担,窗口永远不会被绘制或更新。

我知道我通常应该使用额外的线程进行工作,但我必须使用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,但我不认为它在这种情况下非常有用,因为对主线程的访问权限太多了。

有什么建议吗? 感谢

2 个答案:

答案 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;
        });

完成工作后,您需要向对话框发送一条消息,告知它现在应该关闭。通过在你的对话框处理的线程中触发一个事件来做到这一点。