2011-04-14 120 views
-1

我想弄清楚保持我的應用程序響應的最佳方式。下面顯示了我目前正在使用的代碼。我發現的是後臺工作者線程是要走的路。後臺工作線程

private void cleanFiles() 
    { 
      if (listView1.CheckedItems.Count != 0) 
      { 

       // If so, loop through all checked files and delete. 

       foreach (ListViewItem item in listView1.CheckedItems) 
       { 

        string fileName = item.Text; 
        string filePath = Path.Combine(tFile + fileName); 

        try 
        { 

         File.Delete(filePath); 
        } 
        catch (Exception) 
        { 
         //ignore files being in use 
        } 

        MessageBox.Show("Files Cleaned"); 
       } 


      } 
      else 
      { 
       MessageBox.Show("Please put a check by the files you want to delete"); 
      } 

     } 


    } 

    } 

回答

1

,讓您的程序響應的最簡單方法是使用BackgroundWorker

List<string listWithFilenames = new List<string>(); 
BackgroundWorker bw = new BackgroundWorker(); 
bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 
bw.RunWorkerAsync(listWithFilenames); 

查看documentation

+0

後臺工作人員幫助我。謝謝! – partialdata 2012-05-29 19:14:33

0

假設方法您發佈的UI線程的環境下運行, 所有你需要做的就是將邏輯(foreach部分) 在這樣的方法:

private void DeleteFiles(object state) 
{ 
/// your logic here 
} 

,並調用來自cleanfiles方法的ThreadPool.QueueWorkItem(new WaitCallback(DeleteFiles));

如果您運行的.NET 4.0中,你可以使用類似:

Task myTask = Task.Factory.StartNew(() => DoWork(null)); 後來檢查myTask狀況,看看它完成。

+0

即時通訊錯誤代表'System.Action'不接受1個參數 – partialdata 2011-04-14 18:36:16

+0

我的錯誤,固定代碼 – Menahem 2011-04-17 07:37:32