【发布时间】:2015-02-23 03:32:55
【问题描述】:
我正在尝试使用 async、await 和 task 在我的 Web 应用程序中实现异步需求之一。我的控制器类中有以下代码。我想要的是,在流程到达打印“控制器 1”后,系统在单独的线程上启动业务方法,无需等待响应系统应该到达控制器中的打印语句并打印“控制器 2”。但是当我执行下面的代码时,我得到的输出模式是这样的-
controller 1
PlandesignBS
controller 2
而我期待这个-
controller 1
controller 2 (Flow should reach here immediately rather than waiting
for business methods to get executed First)
控制器类代码-
public class PlanDetailsController : Controller
{
[HttpPost]
public async Task<ActionResult> Generate(PlanDetailsVM planDetailsVM)
{
System.Diagnostics.Debug.WriteLine("controller 1");
//calls business method to generate
quoteId = await Task.Run(() => _planDesignBS.GenerateBS(planDetailsVM));
System.Diagnostics.Debug.WriteLine("controller 2");
return Json(quoteId , JsonRequestBehavior.AllowGet);
}
}
业务方法代码-
public int GenerateBS(PandetailsDTO plandetails)
{
System.Diagnostics.Debug.WriteLine("PlandesignBS");
//STEP 1-> call to dataLogic Layer to use Entity Framework
// STEP 2-> call to a method (this method is part of dll used
//in our project and we don't have any control on it)
return quoteId
}
编辑:我尝试这样做的原因是我想使用来自客户端的一些 http Posts 请求。假设我首先从客户端调用 Generate 操作方法,然后不想等待它的响应,同时又想调用另一个 http post。
编辑:包括 EF 代码,当我尝试遵循几个解决方案时,我正在执行该代码。此方法将从我的 GenerateBS 方法中调用。我在 getSICCode 方法中的这一行遇到异常-
DbContext.Database.ExecuteSqlCommand("spGET_SICCode @industryClasifID,@industrySubClasifID,@SICCode OUTPUT", industryClasifID, industrySubClasifID, SICCode);
EF 代码-
public class PlanDesignRepository : Repository<myobject>, IPlanDesignRepository
{
private IDbSet<myobject> _dbSet;
private DbContext _dbContext;
private IDbSet<myobject> DbSet
{
get
{
if (_dbSet == null)
{
_dbSet = base.UnitOfWork.Context.Set<myobject>();
}
return _dbSet;
}
}
private DbContext DbContext
{
get
{
if (_dbContext == null)
{
_dbContext = base.UnitOfWork.Context;
}
return _dbContext;
}
}
public string GetSICCode(IndustryClassficDO industryClassficDO)
{
SqlParameter industryClasifID = new SqlParameter("industryClasifID", SqlDbType.Int);
industryClasifID.Value = industryClassficDO.IndustryClassificationId;
SqlParameter industrySubClasifID = new SqlParameter("industrySubClasifID", SqlDbType.Int);
industrySubClasifID.Value = industryClassficDO.IndustrySubClassificationId;
SqlParameter SICCode = new SqlParameter("SICCode", SqlDbType.VarChar, 10);
SICCode.Direction = ParameterDirection.Output;
DbContext.Database.ExecuteSqlCommand("spGET_SICCode @industryClasifID,@industrySubClasifID,@SICCode OUTPUT", industryClasifID, industrySubClasifID, SICCode);
return (string)(SICCode.Value);
}
}
编辑:我有几个 http Post 调用,如下所示-
AngularJS code for AJAX calls:
$http({
url: key_Url_Generate,
method: Post,
params: $scope.PlanDetails
}).then(function (result) {
//Notify user for success or failure
}
【问题讨论】:
-
你如何处理你的 DataContext?
-
我应该如何处理它?
-
你应该调用 Dispose 方法,但我不是告诉你 Dispose 它我是问你在哪里 Dispose 它,因为你报告的异常说 Dispose 方法被调用,但一些代码试图使用该对象之后。
-
我不熟悉 angular 但这看起来像是一个单一的请求。如果您进行两个单独的 $http(...) 调用,它们应该同时发送。确保不要在回调(然后函数)中添加第二个调用
-
是的,但我不知道为什么它对我不起作用。无论是客户端代码还是服务器端代码中的代码更改,我都会尝试解决我的问题。
标签: c# asp.net asynchronous asp.net-mvc-5 async-await