我刚开始学习如何处理ASP.NET中的异步任务。我决定尝试在我的一个方法中实现一些异步功能。我需要通过访问数据库来获得3个不同的整数,分别命名为按时,迟到,和incomp。这可以全部在同一时间完成,因为方法中没有其他方法依赖于这些调用的输出。阅读http://msdn.microsoft.com/en-us/library/hh524395.aspx和http://msdn.microsoft.com/en-us/library/vstudio/hh191443(v=vs.110).aspx之后,这是我想出了代码:正确的方式来运行这些异步任务?
public async Task<ActionResult> KPI(int id = 0)
{
var ontime = getOnTimeTasks(id);
var late = getLateTasks(id);
var incomp = getIncompleteTasks(id);
await System.Threading.Tasks.Task.WhenAll(ontime, late, incomp);
ViewData["ontime"] = ontime;
ViewData["ictasks"] = late;
ViewData["incomplete"] = incomp;
return View();
}
public async Task<int> getOnTimeTasks(int id)
{
return await System.Threading.Tasks.Task.Run(() => db.Tasks.Include(t => t.Job).Where(t => t.Company == User.Identity.Name && t.RepId == id && t.Complete == true && t.CompleteDate <= t.Job.Deadline).ToList().Count);
}
public async Task<int> getLateTasks(int id)
{
return await System.Threading.Tasks.Task.Run(() => db.Tasks.Include(t => t.Job).Where(t => t.Company == User.Identity.Name && t.RepId == id && t.Complete == true && t.CompleteDate > t.Job.Deadline).ToList().Count);
}
public async Task<int> getIncompleteTasks(int id)
{
return await System.Threading.Tasks.Task.Run(() => db.Tasks.Include(t => t.Job).Where(t => t.Company == User.Identity.Name && t.RepId == id && t.Complete == false).ToList().Count);
}
我甚至不知道这是否会工作(同时运行所有三个任务),所以任何人都可以帮助新手这吗?
**更新:**我在运行此代码收到以下错误: The context cannot be used while the model is being created. This exception may be thrown if the context is used inside the OnModelCreating method or if the same context instance is accessed by multiple threads concurrently. Note that instance members of DbContext and related classes are not guaranteed to be thread safe.
谢谢您的回复!这是否仍然允许我同时执行所有三个“getTasks”函数?即使有'等待'? – 2014-10-07 12:31:42
@ barnacle.m:当前的代码将一次运行一个。如果你想同时运行它们,你需要三种不同的数据库上下文。 – 2014-10-07 12:36:10
我可以分别为每个任务实例化上下文,这是否允许我提高性能?这些任务都不依赖于其他任务,因此可以一起执行。 – 2014-10-07 12:38:03