以线程安全的方式压缩列表

时间:2014-06-24 09:31:21

标签: c# multithreading list

目前,我正在使用以下伪代码:

List<MyMail> m = new List<MyMail>();
foreach(var user in users) {
    var mails = mailLibrary.getAllMails(user); // synchronously; 100ms waiting time
    foreach(var mail in mails) m.add(mail);
}
return m.ToArray();

现在我想并行获取所有用户的邮件,因为mailLibrary是同步编写的,并且涉及多个邮件服务器。 尽管如此,列表应该按照以前的方式进行排序。所以我会尝试

List<MyMail> m = new List<MyMail>();
Parallel.ForEach(users,user => {
    List<MyMail> innerM = new List<MyMail>();
    var mails = mailLibrary.getAllMails(user); // synchronously; 100ms waiting time
    foreach(var mail in mails) innerM.add(mail);
    // How to zip innerM list content into m such that content is at the correct position?
});
return m.ToArray();

如何将innerM压缩到m的正确位置?

1 个答案:

答案 0 :(得分:4)

您是否考虑过使用Parallel LINQ?

return users.AsParallel().AsOrdered()
            .SelectMany(user => mailLibrary.getAllMails(user))
            .ToArray();
根据{{​​3}},我相信在保持所有排序方面会做正确的事。