0

我编写的应用程序(在 C# 中)的中心过程可能涉及从磁盘文件中读取许多数据,然后处理这些读取数据。然后通过 将数据写入BinaryWriter相同的输出文件。

这个过程通常很长,所以我想,如果它在多核机器上运行,它可以为每次读取最多内核 x 处理器线程实例化一个线程。每个人都会处理数据,然后将其写出。除了BinaryWriter.

我注意到,当我的机器上的 4 核 taskmgr 应用程序说它正在使用 25% 的 CPU 时,我猜它正在使用其中一个内核的 100%,并且应用程序可能会从使用另一个内核中受益匪浅3核也是。

如果我使用一个类Working和一个函数Working.work()来进行处理,并且我有四个内核可以使用(当然这 4 个不会被硬编码;我会询问我有多少个并使用这个数字我会做什么?

目前我有类似的东西:

    Working working = new Working();

    while (bytesRead = binaryReader(ref buffer,0,bytesToRead) != 0)
    {
      work.buffer = buffer;
       working.work();
       binaryWriter(buffer,0,buffer.Length);
    }

将这一切转移到一个线程似乎会有所帮助。但我必须知道线程何时完成,以便新读取可以在线程上。

4

1 回答 1

1

这里有一些关于异步文件 IO 和在 MSN 上使用任务的好例子:http: //msdn.microsoft.com/en-us/library/jj155757.aspx

通常,您可以做一个异步工作队列(注意:从 .NET 4.0 开始,有一个 ConcurrentQueue 集合确实有助于促进异步处理),您可以设置 x 数量的工作任务。完成的任务然后您将移动到一个非异步写入队列,您为此设置了一个不同的任务等待新项目的到达。

另请参阅 Microsoft 关于此主题的更多信息:http: //msdn.microsoft.com/en-us/library/hh873173.aspx

特别是从生产者/消费者模式向下应该与您相关。(虽然我没有看到它使用 ConcurrentQueue,也许是因为那是在 4.0 之前编写的?)

于 2013-10-19T20:20:18.857 回答