使用Task.Factory

时间:2015-07-20 19:13:18

标签: c# asp.net-mvc validation email asynchronous

我想做的是让我的代码获取电子邮件列表,并将每个电子邮件提供给服务,以便异步验证为有效。

我正在使用的服务是Cobisi .NET Email Verify,它允许您通过调用基于任务的异步API来验证电子邮件是否对各种验证级别有效。

使用此博客文章(http://www.hanselman.com/blog/BackToParallelBasicsDontBlockYourThreadsMakeAsyncIOWorkForYou.aspx)我认为我的代码将异步验证我的电子邮件列表并返回一个Task< bool>表示通过验证的电子邮件,但是我不确定如何在Task.Factory.ContinueWhenAll()中使用此数组来返回一组干净的电子邮件。

到目前为止,这是我的代码

异步电子邮件验证方法:

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.ContinueWhenAll(
            (from email in cleanEmailList1 select ValidateEmailCleanAsync(email)).ToArray(),
            completedTasks => { /* Create New String Collection For Clean Emails */ });

有没有办法放入一些代码,我的注释块要么构建一个干净的电子邮件新集合,要么将它们添加到预先构建的集合中?有没有更好的方法来完成我想要做的事情?

1 个答案:

答案 0 :(得分:3)

重写fork-join以使用await,一切都变得简单了:

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

await Task.WhenAll(tasks);

ProcessTasks(tasks);

ProcessTasks可以是您喜欢的任何内容。