2015-07-20 5 views
1

Что бы я хотел сделать, так это то, что мой код принимает список писем и передает их в службу, которая будет проверяться как действительная асинхронно.Очистка электронной почты async с использованием Task.Factory

Служба, которую я использую, это Cobisi .NET Email Verify, которая позволяет проверять электронную почту как действительную для различных уровней проверки, вызывая их асинхронный API на основе задач.

С помощью этого блога (http://www.hanselman.com/blog/BackToParallelBasicsDontBlockYourThreadsMakeAsyncIOWorkForYou.aspx) Я думаю, что мой код будет асинхронно проверить мой список сообщений электронной почты и возвращает массив Task < BOOL> представляющие электронные сообщения, которые прошли проверку, однако я не уверен, как использовать этот массив в Task.Factory.ContinueWhenAll(), чтобы вернуть коллекцию чистых писем.

Вот мой код до сих пор

Асинхронный Email Validation Метод:

public async Task<bool> ValidateEmailCleanAsync(string email) 
    { 
     using (var _engine = new VerificationEngine()) 
     { 
      var verification = new Verification(email); 
      await _engine.RunAsync(verification, VerificationLevel.CatchAll); 
      return verification.State.Result.LastStatus == VerificationStatus.Success; //returns true if validation is passed or false if not 
     } 
    } 

Task Factory для проверки сообщений электронной почты:

Task.Factory.ContinueWhenAll(
      (from email in cleanEmailList1 select ValidateEmailCleanAsync(email)).ToArray(), 
      completedTasks => { /* Create New String Collection For Clean Emails */ }); 

Есть ли способ введите код, где мой блок комментариев либо создать новую коллекцию чистых писем или добавить их в предварительно собранную коллекцию? Есть ли лучший способ добиться того, что я пытаюсь сделать?

ответ

3

Перепишите вилка присоединиться использовать все ждут и просто снова становится:

var tasks = 
    (from email in cleanEmailList1 select ValidateEmailCleanAsync(email)).ToArray(); 

await Task.WhenAll(tasks); 

ProcessTasks(tasks); 

ProcessTasks может быть все что угодно.

+0

Спасибо за отличный ответ. К сожалению, теперь, когда «ждут _engine.RunAsync (проверка, VerificationLevel.CatchAll); line работает, как представляется, просто обрабатывается навсегда, даже не возвращаясь к отладчику. Хотя я предполагаю, что это больше проблема с моим использованием программного обеспечения Colbisi, чем попытка параллельного выполнения этих задач. –

+0

Либо это то, что мы назовем Wait или Result где-то, что вызывает классический тупик ASP.NET. – usr

+0

Это может быть так, я буду искать экземпляры, где я, возможно, сделал это в разделе «ProcessTasks». Еще раз спасибо. –