Подтвердить что ты не робот

Как добавить IEumerable Collection в очередь и обрабатывать каждый элемент асинхронно в .NET?

Я создал метод для чтения сообщений о входящих сообщениях с помощью сервера обмена, как показано ниже. Как добавить эти коллекции 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;
}

Ниже приведен процесс, который нужно вызвать асинхронно, используя каждый элемент в очереди

static void AddAttachment(string  subject ,string docId, string user, string fileName)
{
    var url = new StringBuilder();
    url.Append(string.Format("https://webdemo-t.test.com:8443/Services/Service/MyService.svc/AddAttachment?User={0}&Engagement={1}&FileName={2}&DocumentTrasferID={3}", user, subject, fileName, docId));

    Console.WriteLine(url.ToString());
    WebRequest request = WebRequest.Create(url.ToString());
    var credential = new NetworkCredential("user", "xxxx", "xxxx");
    request.Credentials = credential;
    WebResponse ws = request.GetResponse();
    Encoding enc = System.Text.Encoding.GetEncoding(1252);
    var responseStream = new StreamReader(ws.GetResponseStream());
    string response = responseStream.ReadToEnd();
    responseStream.Close();
    Console.WriteLine(response);
}
4b9b3361

Ответ 1

Вы можете запустить новую задачу для каждого приложения. Нет необходимости думать о количестве заданий, которые вы создаете. Задачи не отображаются в потоки 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.

Другой способ - использовать асинхронный API классов WebRequest/WebResponse.

Ответ 2

Если ваш .NET равен 4.0 или smth, вы попробовали метод расширения AsParallel?