.net 4.0异步文件复制

时间:2013-11-27 07:39:11

标签: c# .net asynchronous

我有一个小的.net 4.0应用程序,基本上比较文件日期,如果文件被更改,则将这些文件从位置a复制到位置b。完成此复制作业时,它会显示带有进度条的小UI等。

如何以异步方式执行此文件的上次写入时间比较和文件复制?当我开始在应用程序启动后立即执行此操作时,应用程序ui加载非常缓慢并且ui未正确更新(因为我的应用程序正在等待文件复制等)。

编辑: ...我想从长时间运行的文件任务更新UI,BackgroundWorker有这个选项,但其他选项呢?

3 个答案:

答案 0 :(得分:1)

您可以通过创建任务来实现这一目标(例如,在您的加载方法中执行)

Task.Run(() => DoHeavyStuf());

您可以执行重度stuf异步(例如I / O)的方法

private void DoHeavyStuf()
{
   //Heavy work (simulated by thread.sleep)
   System.Threading.Thread.Sleep(5000);
   MessageBox.Show("Heavy stuf completed");
}

对于.NET 4.0,您可以使用(信用:Rotem)

new Task(DoHeavyStuf).Start();

答案 1 :(得分:1)

如果您只想在操作完成后通知UI,则可以使用此功能(在.Net 4.0上):

Task.Factory.StartNew(() =>
            {
                //Copy file here
            }).ContinueWith((prevTask) =>
                {
                    if (prevTask.Exception != null)
                    {
                        // log/display exception here
                        return;
                    }
                    //display success result here
                }, TaskScheduler.FromCurrentSynchronizationContext());

如果要在该过程中复制多个文件和通知UI,可以使用:

        var currentSyncContext = SynchronizationContext.Current;
        Task.Factory.StartNew(() =>
            {
                //do some work
                currentSyncContext.Send(new SendOrPostCallback((arg) =>
                {
                    //your UI code here
                }), "your current status");
                //do some work
            });

答案 2 :(得分:0)

您可以使用BackGroundWorker来处理此类事情:

BackGroundWorker worker = new BackGroundWorker();
worker.DoWork += myWorkDelegate; // method, delegate or lambda that does the heavy work
worker.RunWorkerCompleted += myCompletedDelegate; //method delegate or lambda to execute when DoWork has finished

worker.RunWorkerAsync();