【问题标题】:Parallel file IO while doing heavy CPU operations in C#在 C# 中执行繁重的 CPU 操作时并行文件 IO
【发布时间】:2016-12-01 21:47:10
【问题描述】:

我对 C# 比较陌生,并试图确定文件操作方面的最佳实践。

我的应用程序正在使用Parallel.ForEach 来解析几个大文件。在该方法中,我使用StreamWriter 写入单个文件,但在该过程中必须锁定对象。我预计这种方法会放慢速度,并且知道我必须为文件 IO 设置一个单独的线程。

这让我想到了我的问题。 C# 是否已经为非阻塞、线程安全的文件 IO 提供了命名空间?

谢谢!

【问题讨论】:

  • 如果延迟写入并且超时将数据写入文件而不是进行并行写入,您可能会获得速度提升。
  • 据我所知,由于 IO 的性质,不可能对同一个流资源进行真正的并行操作。
  • @Abion47 问题不是要求那个。事实上,他明确表示他正在明确序列化它。
  • @Servy 他也在询问是否有非阻塞、线程安全的方法来执行 IO。我认为这意味着他正在寻找一种方法,使他能够安全地将他的写入多线程到StreamWriter。也许我的假设是错误的?

标签: c# multithreading file-io parallel-processing


【解决方案1】:

.NET 提供了异步文件 IO 的操作,也提供了同步异步操作的工具。但是,如果您想要这两个功能,则必须自己组合这两个工具,这并不是特别困难。您可以创建一个简单的队列来为您序列化异步操作,如shown here。一旦你有了它,你就可以在你的所有工作人员之间共享一个队列,让他们每个人都排队调用WriteAsync 来做你的写作。

请注意,您实际上根本不需要单独的线程来写入文件。它可以是异步的,不需要专用线程。

【讨论】:

  • 我认为这将是我的路线。谢谢你的澄清!
  • Servy,我正在着手实现这一点。我了解信号量是什么,但我试图了解如何在我的特定用例中使用它。在开始解析数据之前,我是否创建了 async Task 方法和 Enqueue?那么当有数据要写入的时候锁定/解锁这个队列呢?我创建了最小的例子dotnetfiddle.net/WKcS6H。看TaskWrite,是我要往的方向吗?
  • @user0000001 您只需要创建一个async 方法,该方法将您想要的任何内容写入文件(使用.NET 文件操作公开的异步操作)并将对该方法的调用加入队列。您永远不需要实际触摸锁;队列的存在是为了封装确保方法按顺序运行所需的所有行为。
猜你喜欢
  • 2016-06-11
  • 2020-12-09
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2017-06-30
相关资源
最近更新 更多