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.
});
答案 0 :(得分:0)
我解决你的代码的方式,你不会以任何方式修改inputDictionary(只需从磁盘上的文本文件中删除行)。在这种情况下,你可以坚持你的代码,这将是正常的,如果不是你应该使用线程安全的ConcurrentBag。
第一种情况的另一种方法是使用常规for循环并使用async io方法来读取和写入文件。
async io操作与cpu绑定的异步操作不同,因为它们不会产生要执行的线程,这无法通过减少线程切换开销来加速应用程序。
转到这些页面以获取有关同步编程和异步操作的更多信息: Asynchronous Programming with Async and Await