Asp.net mvc 4 ';TaskEx&x27;不';不行!(BCL)

Asp.net mvc 4 ';TaskEx&x27;不';不行!(BCL),asp.net-mvc-4,async-await,base-class-library,Asp.net Mvc 4,Async Await,Base Class Library,我是新来的 我有一个复杂的问题 我正在使用.NET4.0MVC4,添加有关Microsoft BLC使用异步的参考资料,请稍候 写 await System.Threading.Tasks.TaskEx.WhenAll(tl); 对于等待线程,工作当然结束。 但这里突然出现了错误 Error 13 The type or namespace name 'TaskEx' does not exist in the namespace 'System.Threading.Tasks' (ar

我是新来的

我有一个复杂的问题

我正在使用.NET4.0MVC4,添加有关Microsoft BLC使用异步的参考资料,请稍候

await System.Threading.Tasks.TaskEx.WhenAll(tl);
对于等待线程,工作当然结束。 但这里突然出现了错误

Error   13  The type or namespace name 'TaskEx' does not exist in the namespace 'System.Threading.Tasks' (are you missing an assembly reference?)   
我在另一个解决方案上测试了很多次另一个项目,但它是有效的。不是这样的

有什么小帮助的想法吗

这里是整个方法

public async void SendEmailEwsAsync(string subject, string mailBody, string fileName)
    {
        try
        {
            List<System.Threading.Tasks.Task> tl = new List<System.Threading.Tasks.Task>();
            foreach (var kvp in Receivers)
            {
                EmailMessage mail = CreateMailEws(subject, mailBody);

                mail.ToRecipients.Add(kvp.Value);
                if (!this.TestFlag)
                {
                    mail.Attachments.AddFileAttachment(string.Format(fileName, EmailNamePair[kvp.Value]), kvp.Key);
                }

                tl.Add(TaskSendAsync(mail));
                this.CurrentCursor++;
            }
            await System.Threading.Tasks.TaskEx.WhenAll(tl); //error here
        }
        catch (Exception e)
        {
            throw e;
        }
        finally
        {
            this.IsEnd = true;
        }
    }

    private System.Threading.Tasks.Task TaskSendAsync(EmailMessage mail)
    {
        Action action = delegate()
        {
            mail.Save(new FolderId(WellKnownFolderName.Drafts, new Mailbox("noreply@whatever.com"))); 
            mail.SendAndSaveCopy(new FolderId(WellKnownFolderName.SentItems, new Mailbox("noreply@whatever.com"))); 
        };
        System.Threading.Tasks.Task task = new System.Threading.Tasks.Task(action);
        task.Start();
        return task;
    }
public async void sendmailewsasync(字符串主题、字符串正文、字符串文件名)
{
尝试
{
List tl=新列表();
foreach(接收器中的var kvp)
{
EmailMessage mail=CreateMailEws(主题,邮件正文);
mail.ToRecipients.Add(kvp.Value);
如果(!this.TestFlag)
{
AddFileAttachment(string.Format(文件名,EmailNamePair[kvp.Value]),kvp.Key);
}
tl.Add(TaskSendAsync(mail));
这个.CurrentCursor++;
}
等待System.Threading.Tasks.TaskEx.WhenAll(tl);//此处出错
}
捕获(例外e)
{
投掷e;
}
最后
{
this.IsEnd=true;
}
}
专用System.Threading.Tasks.Task TaskSendAsync(电子邮件)
{
Action=delegate()
{
mail.Save(新文件夹ID(WellKnownFolderName.Drafts,新邮箱()noreply@whatever.com"))); 
mail.SendAndSaveCopy(新文件夹ID(WellKnownFolderName.SentItems,新邮箱noreply@whatever.com"))); 
};
System.Threading.Tasks.Task Task=新的System.Threading.Tasks.Task(操作);
task.Start();
返回任务;
}
这里有全部参考资料


感谢您的关注。

您不需要引用TaskEx,您可以使用WaitAll而不是Wheall

// Wait for all tasks in list to complete
Task.WaitAll(tl);

谢谢你的评论!一个问题,这是完全相同的工作吗?在TaskEx.WhenAll()和Task.WaitAll()之间?WhenAll()方法实际上会创建一个新的可等待的任务,您可以等待,而WaitAll()则不能。细粒度的差异,当然取决于你想要什么。这里有一个很好的答案:我已经有了同步方法。所以我想做一个异步的。WaitAll()似乎是块类型,对吗?但我还是要感谢你的关注。试着不用TaskEx。我从未使用过它,只有Task.WhenAll(tl)Task.WhenAll()在低于.net 4.5的版本下不受支持。如果您是指ASP.net MVC,则不能在ASP.net上使用
Microsoft.Bcl.Async
。即使您让它编译(这是可能的),它在运行时也不会正常运行。@StephenCleary for real?事实上,我确实在这个项目中添加了关于MVC的参考,但在我的另一个MVC项目中,它是一种公共库。所以我删除了MVC引用,但仍然不起作用。要明确的是,
Microsoft.Bcl.Async
根本不能在ASP.NET上使用。要在ASP.NET上使用
async
,您必须至少升级到.NET 4.5。@StephenCleary是的。但我使用的是下面nuget for.NET4.5中的Microsoft.Bcl.Async。