使用parallel.Foreach读取文件内容和删除特定行

时间:2016-02-17 10:47:59

标签: c# task-parallel-library parallel.foreach

Class Student
{
   Int studentId,
   List<ClassB> Books,
   Boolean IsPassed
}

Class Book
{
    Int  bookId,
    List<int> pages
}

这里我将图书数据存储在磁盘中。

BookID1 (Folder Name)

pageNumber1.txt
pageNumber2.txt
pageNumber3.txt
pageNumber4.txt


BookID2 (Folder Name)

pageNumber1.txt
pageNumber2.txt
pageNumber30.txt
pageNumber45.txt

从我的数据库中我将​​返回一些像这样的东西

StudentId         bookId.      Page     IsPassed
1                    1      1,2,3,4      1  
1.                   2      1,2,30,45    1

我会将它们放入字典中,如下所示

Key = bookId
Value = pages

Dictionary<long, List<int>> inputDictionary

如何并行读取相应页面中的数据并按行号删除某些行而不使用多个for循环 我试过这个。如果有更好的选择,请告诉我?

Parallel.ForEach
( 
   inputDictionary
   ,new ParallelOptions { MaxDegreeOfParallelism = 2 }
   , Book =>
  {
    foreach( int pagenumber in Book.Value)
    {
    var bookId = Book.Key.ToString();
    var PathToPage =  GetDisKPath()+bookId+pagenumber+".txt";
    }
    // read the file and delete some lines from page number.
  });

1 个答案:

答案 0 :(得分:0)

我解决你的代码的方式,你不会以任何方式修改inputDictionary(只需从磁盘上的文本文件中删除行)。在这种情况下,你可以坚持你的代码,这将是正常的,如果不是你应该使用线程安全的ConcurrentBag。

第一种情况的另一种方法是使用常规for循环并使用async io方法来读取和写入文件。

async io操作与cpu绑定的异步操作不同,因为它们不会产生要执行的线程,这无法通过减少线程切换开销来加速应用程序。

转到这些页面以获取有关同步编程和异步操作的更多信息: Asynchronous Programming with Async and Await

Asynchronous File I/O