我编写的一个应用程序(用C#编写)的中心过程可能涉及到从磁盘文件中进行多次读取,然后处理这些读取。然后通过BinaryWriter将数据写出到相同的输出文件。
这个过程通常非常冗长,所以我想,如果它在多核机器上运行,它可以为每次读到内核x处理器线程实例化一个线程。每一个都会处理数据,然后把它写出来。除了BinaryWriter之外,没有其他关键部分。
如果我使用一个类Working和一个函数Working.work()来进行处理,并且我有四个内核要处理(当然,这四个内核不是硬编码的;我会询问我有多少个内核并使用这个数字,我会怎么做?
目前我有一些类似的东西:
Working working = new Working();
while (bytesRead = binaryReader(ref buffer,0,bytesToRead) != 0)
{
work.buffer = buffer;
working.work();
binaryWriter(buffer,0,buffer.Length);
}似乎将这一切都转移到一个线程中会有所帮助。但是我必须知道线程什么时候结束,这样新的读取才能在线程上。
发布于 2013-10-20 04:20:19
这里有一些关于异步文件IO和在MSN上使用任务的好例子:http://msdn.microsoft.com/en-us/library/jj155757.aspx
一般而言,您可以做的是为工作项创建一个异步工作队列(注意:从.NET 4.0开始,有一个ConcurrentQueue集合可以帮助进行异步处理),您可以在其中设置x个工作任务。已完成的任务,然后将移动到一个非异步写入器队列,您可以为该队列设置一个等待新项到达的不同任务。
在这里可以看到更多来自微软的关于这个主题的信息:http://msdn.microsoft.com/en-us/library/hh873173.aspx
尤其是从生产者/消费者模式向下应该与您相关。(虽然我没有看到它使用ConcurrentQueue,也许是因为它是在4.0之前编写的?)
https://stackoverflow.com/questions/19470313
复制相似问题