2013-11-27 40 views
1

我有一個小的.net 4.0應用程序,基本上比較文件日期,如果文件更改將這些從位置a複製到位置b。當這個複製工作完成時,它顯示很少的UI和進度條等。.net 4.0異步文件副本

如何做這個文件最後寫入時間比較和文件複製異步?作爲即時開始這樣做後,應用程序啓動,應用程序用戶界面加載非常緩慢,用戶界面不更新正確(因爲我的應用程序正在等待文件副本等)。

編輯: ...我想從長期運行的文件任務更新用戶界面,BackgroundWorker有這個選項,但其他選項呢?

+0

在'Task'或'Thread'中啓動它? – Rotem

回答

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

您可以通過創建一個任務實現這一目標(例如,做在你的加載方法)

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

哪裏可以做重塞入異步(例如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(); 
+0

我認爲Task.Run()是.net 4.5的特性,即時貼在.net 4.0中。 – devha

+0

Ahhhhh。一個線程上的I/O! :sadface: –

+0

您可以添加庫來處理.NET 4.0的任務和異步/等待。 (http://msdn.microsoft.com/en-us/library/dd460717(v=vs.110).aspx)檢查nuget –

1

如果你只是想通知UI操作完成後,就可以使用這個(在.NET 4.0):如果你想在這一進程中複製多個文件的通知UI

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