0

我移动文件

foreach(file){
file.move(file,dst);}

我想在移动每个文件(不同的分区)后更新一个表单,其中包含有关进度的信息。不幸的是,我的 WPF 表单在整个复制/移动队列中都很忙。我尝试了 InvalidateVisual(),但没有成功 - 在移动文件期间(或之后)我能做些什么来确保 GUI 响应能力?

4

2 回答 2

2

Kasan,我认为 BackgroundWorker 对你很有用。任务是不错的方法,但要从任务更新 UI 进度,您需要费心将事件分派到 UI 线程,否则您会收到异常,因为不允许从 UI 以外的线程更新 UI。这是一个示例和文档链接

 public partial class MainWindow : Window
{
    BackgroundWorker _worker = new BackgroundWorker();
    public MainWindow()
    {
        InitializeComponent();
        _worker = new BackgroundWorker();
        _worker.DoWork += worker_DoWork;
        _worker.ProgressChanged += worker_ProgressChanged;
    }

    void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progress1.Value = e.ProgressPercentage;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        _worker.RunWorkerAsync();
    }

    void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        var files = new List<string>();
        foreach(var file in files)
        {
            File.Move(file, /*target*/);
            _worker.ReportProgress(/* here is progress from 0 to 100 */)
        }
    }
}

BackgroundWorker 示例

于 2013-11-03T13:24:31.787 回答
0

如果你想让你的 GUI 保持响应,你应该启动一个新线程来完成这个漫长的任务。

这样你的 GUI 线程就不会被这个长操作阻塞。

class example
{
    static void UpdateStatus(int i)
    {
        // UpdateStatus
        Console.WriteLine(i + "Done!");
    }

    static void Main(string[] args)
    {
        int state = 0;
        Task t = Task.Run(
              () =>
              {
                  // do your stuff - this is going to run async
                  for (int i = 0; i < 10; i++)
                      file.move(file,dst);
                      UpdateStatus(i); // callback to update status 
                  }
              }
            );
        Console.WriteLine("Started"); // You wont block this code by running the async part
        t.Wait(); 
        Console.WriteLine("DONE");
        Console.ReadKey();

    }
}

在您的情况下,您可以这样使用:

        Task t = Task.Run(
              () =>
              {
                  // do your stuff - this is going to run async
                  foreach(File file in Files){
                  {
                      move(file);
                      UpdateStatus(i); // callback to update status (eg.:how many files have been moved yet)
                  }
              }
            );
于 2013-11-03T12:15:34.720 回答