使用Parallel.ForEach或Task.Run()以异步方式启动一组任务有什么区别?
版本1:
List<string> strings = new List<string> { "s1", "s2", "s3" };
Parallel.ForEach(strings, s =>
{
DoSomething(s);
});
Run Code Online (Sandbox Code Playgroud)
版本2:
List<string> strings = new List<string> { "s1", "s2", "s3" };
List<Task> Tasks = new List<Task>();
foreach (var s in strings)
{
Tasks.Add(Task.Run(() => DoSomething(s)));
}
await Task.WhenAll(Tasks);
Run Code Online (Sandbox Code Playgroud) 我在ASP.Net MVC 5应用程序中遇到异步控制器问题.我正在使用Entity Framework 6 Code First方法.
我有一个方法
public async Task<ActionResult> Index()
{
using(var context = new MyDbContext())
{
var eventsTask = context.Events
.Where(e => e.Enable)
.ToListAsync();
var countTask = context.Users
.CountAsync();
await Task.WhenAll(eventsTask, countTask);
return View(new ViewModel()
{
Events = eventsTask.Result,
Count = countTask.Result
});
}
}
Run Code Online (Sandbox Code Playgroud)
我这里有两个异步方法.我通过MiniProfiler分别测量了它们.它们需要大约85毫秒.
但是在我的方法中,我使用Task.WhenAll()运行它们.我相信它以异步方式执行Db查询,并且两者都需要大约85-90毫秒.但它需要~170-180.所以我有异步方法同步运行(彼此跟随).
我认为这是因为背景.当我删除上下文查询并使用HttpClient调用许多api方法时,我有一个测试.它需要时间等于更长的时间(3 api调用,每个~500 ms.完全方法需要~600 ms).我相信可以异步执行EF方法.
有谁知道解决方案