Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将IEumerable集合添加到队列中,并在.NET中异步处理每个项?_C#_.net - Fatal编程技术网

C# 如何将IEumerable集合添加到队列中,并在.NET中异步处理每个项?

C# 如何将IEumerable集合添加到队列中,并在.NET中异步处理每个项?,c#,.net,C#,.net,我创建了一个使用exchange server读取收件箱新邮件的方法,如下所示。如何将这些IEnumerable集合添加到队列中,并异步处理队列中的每个项目列表 private static IEnumerable<ExchangeEmailInformation> GetInboxItems(ExchangeService service) { var emailInformations = new List<ExchangeEmailInformation>(

我创建了一个使用exchange server读取收件箱新邮件的方法,如下所示。如何将这些IEnumerable集合添加到队列中,并异步处理队列中的每个项目列表

private static IEnumerable<ExchangeEmailInformation> GetInboxItems(ExchangeService service)
{
    var emailInformations = new List<ExchangeEmailInformation>();
    try
    {       
        SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));
        var itemview = new ItemView(int.MaxValue);
        FindItemsResults<Item> findResults = service.FindItems(WellKnownFolderName.Inbox, searchFilter, itemview);
        Console.WriteLine("\n-------------Result found:-------------");
        service.LoadPropertiesForItems(findResults, PropertySet.FirstClassProperties);

        foreach (var item in findResults)
        {
            emailInformations.Add(new ExchangeEmailInformation
            {
                Attachment = item.Attachments ?? null,
                Body = item.Body.BodyType == BodyType.HTML ? ConvertHtml.ToText(item.Body.Text) : item.Body.Text,
                Subject = item.Subject,
                RecievedDate = item.DateTimeReceived
            });
        }
    }
    catch (Exception ee)
    {
        Console.WriteLine("\n-------------Error occured:-------------");
        Console.WriteLine(ee.Message.ToString());
        Console.WriteLine(ee.InnerException.ToString());
        Console.ReadKey();
    }
    return emailInformations;
}

您可以为每个附件启动新任务。不需要考虑您产生的任务数量。任务没有映射到线程1乘1

foreach (var item in findResults)
{
    emailInformations.Add(new ExchangeEmailInformation ...);

    // start new task
    Task.Factory.Start(() => {
        AddAttachment(item.Subject, item.docId, item.User ...);
    })
}
此方法不要求您使用异步API


另一种方法是利用WebRequest/WebResponse类的异步API。

如果您的.NET是4.0或smth,您是否尝试了
AsParallel
扩展方法?

我想异步处理队列中的每个项目。您需要改进您的问题。算法的哪些步骤必须异步执行?我已经更新了这个问题,添加了异步执行所需的方法+1 PLinq可以帮助您实现这一点。我需要处理队列中的每个项目列表,为什么不这样做:foreach(findResults.AsParallel()中的var item){…}
foreach (var item in findResults)
{
    emailInformations.Add(new ExchangeEmailInformation ...);

    // start new task
    Task.Factory.Start(() => {
        AddAttachment(item.Subject, item.docId, item.User ...);
    })
}