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