如何将单线程应用程序转换为多线程

时间:2013-10-19 19:43:36

标签: c# multithreading

我编写的应用程序(在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);
    }

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

1 个答案:

答案 0 :(得分: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之前写的?)