【问题标题】:How to delete a folder asynchronously如何异步删除文件夹
【发布时间】:2012-01-20 22:00:06
【问题描述】:

我正在运行一个从网络驱动器中删除文件夹的 Windows 服务。我想让删除异步。如何做到这一点?

现在我正在遍历目录并调用

Directory.Delete(fullPath, true);

谢谢

【问题讨论】:

  • 很难理解为什么这会成为服务的要求,他们已经使用了线程。你可以用另一个。
  • 把你的目录删除放在一个方法中,并异步调用它。很简单。这是一个很棒的教程。您还可以使用异步回调/事件来发布进度更新; codeproject.com/Articles/14931/Asynchronous-Method-Invocation
  • 为什么 Windows 服务应该异步执行操作?无论如何,它在后台运行。异步操作通常用于保持 UI 响应,而不是在长时间运行的操作期间冻结它。
  • @OlivierJacot-Descombes:Windows 服务应该响应启动/停止请求。
  • @OlivierJacot-Descombes: Application.DoEvents 用于 WinForms 应用程序。 Windows 服务没有消息循环。

标签: c# c#-4.0 asynchronous


【解决方案1】:

我会使用任务并行库:

Task.Factory.StartNew(path => Directory.Delete((string)path, true), fullPath);

【讨论】:

  • +1;打败我。以及使用更轻量级的方法传递参数而不是关闭本地参数的荣誉。
  • @vcsjones : 这会不会像异步调用该方法,然后它会被 io 线程稍后选择?
  • @stackoverflowuser 这将在任务中调用Directory.Delete;其中(可能 - 可能)将是线程池中的一个线程。这将允许您的代码在另一个线程上发生删除时继续。
  • @vcsjones 这不是违反这里提到的:blogs.msdn.com/b/pfxteam/archive/2012/03/24/10287244.aspx 吗?我当然不太了解异步主题。
  • Task.Factory.StartNew 方法 should not be used 没有显式配置 TaskScheduler 参数。 Even better 不要使用Task.Factory.StartNew,而是使用Task.Run
【解决方案2】:

如果你在循环,你可以使用一个并行的 foreach

// assuming that you have a list string paths.  
// also assuming that it does not matter what order in which you delete them
Parallel.ForEach(theListOfDirectories, x => Directory.Delete(x));

【讨论】:

  • 仅供参考,使用Parallel.ForEach 方法而不指定MaxDegreeOfParallelism 会导致thread-pool starvation。最好配置此选项以获得一致的行为,而不是让并行度取决于ThreadPool 中当前恰好可用的线程数。
猜你喜欢
  • 2022-07-29
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 2013-12-15
  • 1970-01-01
  • 2010-09-23
  • 2011-03-21
相关资源
最近更新 更多