从第一个窗口中创建的对象中的事件更新第二个窗口控件

时间:2010-09-05 14:04:34

标签: c# .net wpf multithreading dispatcher

这就是我需要的东西(这有点难以解释):

我有2个窗口控件: MainWindow和FileMover 和1个util类: FileMonitor

MainWindow创建了一个FileMonitor的新对象,用于测试它的Loaded事件,该事件创建了一个FileSystemWatcher和一个Timer对象。 FileSystemWatcher监视给定文件夹中的Created和Changed事件,并将Timer添加为某种事件缓冲区(例如,将文件夹或大文件复制到正在监视的文件夹时,会生成多个事件。我只想对第一个事件,而不是其余的事件。这意味着,直到计时器停止并生成其Elapsed事件才会创建FileMover窗口。该窗口有一些基本的文件/文件夹复制/移动逻辑和一个ProgressBar控件,用于显示当前状态。

我的问题是: ProgressBar控件在文件处理期间不会更新。仅当复制/移动方法返回时,才会更新进度条。 我已经尝试过使用FileMover的调度程序和ProgressBar调度程序,但这些都不起作用。

我上面的内容很不清楚,请告诉我! 这是我的来源:

来源: http://pastie.org/1139570

(由于网站限制,不得不将两个源文件都放在一个粘贴中。)

1 个答案:

答案 0 :(得分:1)

您必须在另一个线程中加载该文件。如果没有,UI将不会刷新。一个简单的方法是BackgroundWorker - 类。这是一个简短的例子:

BackgroundWorker bgWorker = new BackgroundWorker() { WorkerReportsProgress=true};
bgWorker.DoWork += (s, e) => {
    // Load here your file/s
    // Use bgWorker.ReportProgress(); to report the current progress
};
bgWorker.ProgressChanged+=(s,e)=>{
    // Here you will be informed about progress 
    //  (if bgWorker.ReportProgress() was called in DoWork)
};
bgWorker.RunWorkerCompleted += (s, e) => {
    // Here you will be informed if the job is done
};
bgWorker.RunWorkerAsync();