【发布时间】:2014-12-01 19:44:57
【问题描述】:
我刚刚开始学习如何在 ASP.NET 中处理异步任务。我决定尝试在我的一种方法中实现一些异步功能。我需要通过访问数据库来获取 3 个不同的整数,分别命名为 ontime、late 和 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.
【问题讨论】:
标签: c# asp.net-mvc multithreading asynchronous task