C# .net 4.0异步文件副本

C# .net 4.0异步文件副本,c#,.net,asynchronous,C#,.net,Asynchronous,我有一个小型的.NET4.0应用程序,它基本上比较文件日期,如果文件被更改,则将这些文件从位置a复制到位置b。完成此复制作业时,它会显示带有进度条等的小UI 如何异步执行此文件上次写入时间比较和文件复制?由于我在应用程序启动后立即开始这样做,应用程序ui加载非常缓慢,ui没有正确更新(因为我的应用程序正在等待文件复制等) 编辑: …我想从长时间运行的文件任务中更新UI,BackgroundWorker对此有选项,但其他选项如何?您可以通过创建任务来实现这一点(例如,在加载方法中执行) 您可以在其

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

如何异步执行此文件上次写入时间比较和文件复制?由于我在应用程序启动后立即开始这样做,应用程序ui加载非常缓慢,ui没有正确更新(因为我的应用程序正在等待文件复制等)

编辑:
…我想从长时间运行的文件任务中更新UI,BackgroundWorker对此有选项,但其他选项如何?

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

您可以在其中执行繁重的stuf异步(例如I/O)的方法

对于.NET4.0,您可以使用(学分:Rotem)

您可以使用a来处理这类事情:

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();

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

如果要在该过程中将多个文件复制到notify 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
            });

任务
线程
中启动它?我认为Task.Run()是.net 4.5的特性,我被困在.net 4.0中。您可以添加一个库来处理任务&async/wait for.net 4.0。()选中nugetJust use
新建任务(Stuff).Start(),它在.NET4中。0@SimonWhitehead为什么这一定是个问题?@SimonWhitehead虽然大体上我同意,但它有它的优点。异步I/O需要长时间保持固定句柄(因为需要本机回调),这可能会导致许多问题。为I/O生成一个线程就可以了。
new Task(DoHeavyStuf).Start();
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();
Task.Factory.StartNew(() =>
            {
                //Copy file here
            }).ContinueWith((prevTask) =>
                {
                    if (prevTask.Exception != null)
                    {
                        // log/display exception here
                        return;
                    }
                    //display success result here
                }, TaskScheduler.FromCurrentSynchronizationContext());
        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
            });