2011-04-14 94 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