Asp.net mvc 从非异步mvc控制器调用async方法并返回一个变量 公共异步任务GetReportDataColumnSettings(AdminTechnicianReportInput) { input.CustomerId=m_CustomerId; input.UserId=m_UserId; input.TimeOffset=m_TimeOffset; TReportReturn objTReportReturn=新的TReportReturn(); objTReportReturn.ReportColumns=等待新的ReportsEntityContext().GetTechniciansReportColumns(输入); objTReportReturn.ReportSettings=等待新的ReportsEntityContext().GetGeneralSettingsData(输入); objTReportReturn.ReportData=等待新的ReportsDbContext().GetUserListDynamic(输入); 返回objTReportReturn; } 公共类HomeController:控制器 { 公共行动结果索引() { AdminTechnicianReportInput objInput=新的AdminTechnicianReportInput(); objInput.CustomerId=1; objInput.UserId=5477; objInput.AddUpdateUserid=0; objInput.intRowsPerPage=200; objInput.intPageIndex=0; objInput.intTarget=0; objInput.intStatusId=0; objInput.strSearchQuery=“”; objInput.strSortColumn=“Id”; objInput.strortdirection=“ASC”; var result=new ReportsModel(15477,0).Administration.AdminTechnicianReport.GetReportDataColumnSettings(objInput.result); ViewBag.Title=result.ReportSettings.CustomerName+“\uuuuu”+result.ReportSettings.PrintedOn; 返回视图(); }
} GetReportDataColumnSettings函数调用许多异步方法,这些方法是模型库dll的基础Asp.net mvc 从非异步mvc控制器调用async方法并返回一个变量 公共异步任务GetReportDataColumnSettings(AdminTechnicianReportInput) { input.CustomerId=m_CustomerId; input.UserId=m_UserId; input.TimeOffset=m_TimeOffset; TReportReturn objTReportReturn=新的TReportReturn(); objTReportReturn.ReportColumns=等待新的ReportsEntityContext().GetTechniciansReportColumns(输入); objTReportReturn.ReportSettings=等待新的ReportsEntityContext().GetGeneralSettingsData(输入); objTReportReturn.ReportData=等待新的ReportsDbContext().GetUserListDynamic(输入); 返回objTReportReturn; } 公共类HomeController:控制器 { 公共行动结果索引() { AdminTechnicianReportInput objInput=新的AdminTechnicianReportInput(); objInput.CustomerId=1; objInput.UserId=5477; objInput.AddUpdateUserid=0; objInput.intRowsPerPage=200; objInput.intPageIndex=0; objInput.intTarget=0; objInput.intStatusId=0; objInput.strSearchQuery=“”; objInput.strSortColumn=“Id”; objInput.strortdirection=“ASC”; var result=new ReportsModel(15477,0).Administration.AdminTechnicianReport.GetReportDataColumnSettings(objInput.result); ViewBag.Title=result.ReportSettings.CustomerName+“\uuuuu”+result.ReportSettings.PrintedOn; 返回视图(); },asp.net-mvc,asynchronous,methods,controller,call,Asp.net Mvc,Asynchronous,Methods,Controller,Call,} GetReportDataColumnSettings函数调用许多异步方法,这些方法是模型库dll的基础 HomeController中的Index()方法是一个mvc方法,我想在结果变量中获取返回值。我尝试了getawaiter().getmethod(),但它不起作用。我不喜欢将Index()方法更改为asynk任务。请建议另一种获得结果的方法 我不喜欢将Index()方法更改为asynk任务 为什么不呢?这是迄今为止最简单、最正确的解决方案 第二个最简单的方法是使所有内容同步。也就是说
HomeController中的Index()方法是一个mvc方法,我想在结果变量中获取返回值。我尝试了getawaiter().getmethod(),但它不起作用。
我不喜欢将Index()方法更改为asynk任务。请建议另一种获得结果的方法 我不喜欢将Index()方法更改为asynk任务 为什么不呢?这是迄今为止最简单、最正确的解决方案 第二个最简单的方法是使所有内容同步。也就是说,如果你不去,那就一直同步 从同步代码中调用异步有各种各样的方法,在您的情况下可能有效,也可能无效;这些黑客没有一个在任何地方都能奏效。有关更多详细信息,请参阅我的 在您的情况下,您最初的尝试是使用阻塞黑客。为了在预核心ASP.NET上正常工作,您必须对整个方法调用树中的每个
wait
使用ConfigureAwait(false)
。这通常是可能的(当然,并非总是可能的,因为库代码可能会使用它,也可能不会使用它),但它会导致维护问题(忘记一个,您会遇到一个可能以死锁结束的竞争条件)。我在我的博客上详细解释
如果不能一直异步,如果不能一直同步,那么我建议使用布尔同步参数Hack,它要求整个调用堆栈同时支持同步调用方和异步调用方。对于您发布的代码,它看起来像这样:
public async Task<Utils.TReportReturn> GetReportDataColumnSettings(AdminTechnicianReportInput input)
{
input.CustomerId = m_customerId;
input.UserId = m_userId;
input.TimeOffset = m_timeOffset;
TReportReturn objTReportReturn = new TReportReturn();
objTReportReturn.ReportColumns = await new ReportsEntityContext().GetTechniciansReportColumns<AdminTechnicianReportInput>(input);
objTReportReturn.ReportSettings = await new ReportsEntityContext().GetGeneralSettingsData<AdminTechnicianReportInput>(input);
objTReportReturn.ReportData = await new ReportsDbContext().GetUserListDynamic<AdminTechnicianReportInput>(input);
return objTReportReturn;
}
public class HomeController : Controller
{
public ActionResult Index()
{
AdminTechnicianReportInput objInput = new AdminTechnicianReportInput();
objInput.CustomerId = 1;
objInput.UserId = 5477;
objInput.AddUpdateUserid = 0;
objInput.intRowsPerPage = 200;
objInput.intPageIndex = 0;
objInput.intTarget = 0;
objInput.intStatusId = 0;
objInput.strSearchQuery = "";
objInput.strSortColumn = "Id";
objInput.strSortDirection = "ASC";
var result = new ReportsModel(1, 5477, 0).Administration.AdminTechnicianReport.GetReportDataColumnSettings(objInput).Result;
ViewBag.Title = result.ReportSettings.CustomerName + "__" + result.ReportSettings.PrintedOn;
return View();
}
专用异步任务DoGetReportDataColumnSettingsAsync(AdminTechnician报告输入,布尔同步)
{
input.CustomerId=m_CustomerId;
input.UserId=m_UserId;
input.TimeOffset=m_TimeOffset;
TReportReturn objTReportReturn=新的TReportReturn();
objTReportReturn.ReportColumns=等待新的ReportsEntityContext().GetTechniciansReportColumns(输入,同步);
objTReportReturn.ReportSettings=等待新的ReportsEntityContext().GetGeneralSettingsData(输入,同步);
objTReportReturn.ReportData=等待新的ReportsDbContext().GetUserListDynamic(输入,同步);
返回objTReportReturn;
}
私有任务GetReportDataColumnSettingsAsync(AdminTechnicianReportInput)
{return DoGetReportDataColumnSettingsAsync(输入,同步:false);}
private Utils.TReportReturn GetReportDataColumnSettings(AdminTechnicianReportInput)
{return DoGetReportDataColumnSettingsAsync(输入,同步:true).GetAwaiter().GetResult();}
此模式的关键在于,当参数设置为true
时,任何采用sync
参数的方法都必须返回已完成的任务
我不喜欢将Index()方法更改为asynk任务
为什么不呢?这是迄今为止最简单、最正确的解决方案
第二个最简单的方法是使所有内容同步。也就是说,如果你不去,那就一直同步
从同步代码中调用异步有各种各样的方法,在您的情况下可能有效,也可能无效;这些黑客没有一个在任何地方都能奏效。有关更多详细信息,请参阅我的
在您的情况下,您最初的尝试是使用阻塞黑客。为了在预核心ASP.NET上正常工作,您必须对整个方法调用树中的每个wait
使用ConfigureAwait(false)
。这通常是可能的(当然,并非总是可能的,因为库代码可能会使用它,也可能不会使用它),但它会导致维护问题(忘记一个,您会遇到一个可能以死锁结束的竞争条件)。我在我的博客上详细解释
如果不能一直异步,如果不能一直同步,那么我建议使用布尔同步参数Hack,它要求整个调用堆栈同时支持同步调用方和异步调用方。对于您发布的代码,它看起来像这样:
public async Task<Utils.TReportReturn> GetReportDataColumnSettings(AdminTechnicianReportInput input)
{
input.CustomerId = m_customerId;
input.UserId = m_userId;
input.TimeOffset = m_timeOffset;
TReportReturn objTReportReturn = new TReportReturn();
objTReportReturn.ReportColumns = await new ReportsEntityContext().GetTechniciansReportColumns<AdminTechnicianReportInput>(input);
objTReportReturn.ReportSettings = await new ReportsEntityContext().GetGeneralSettingsData<AdminTechnicianReportInput>(input);
objTReportReturn.ReportData = await new ReportsDbContext().GetUserListDynamic<AdminTechnicianReportInput>(input);
return objTReportReturn;
}
public class HomeController : Controller
{
public ActionResult Index()
{
AdminTechnicianReportInput objInput = new AdminTechnicianReportInput();
objInput.CustomerId = 1;
objInput.UserId = 5477;
objInput.AddUpdateUserid = 0;
objInput.intRowsPerPage = 200;
objInput.intPageIndex = 0;
objInput.intTarget = 0;
objInput.intStatusId = 0;
objInput.strSearchQuery = "";
objInput.strSortColumn = "Id";
objInput.strSortDirection = "ASC";
var result = new ReportsModel(1, 5477, 0).Administration.AdminTechnicianReport.GetReportDataColumnSettings(objInput).Result;
ViewBag.Title = result.ReportSettings.CustomerName + "__" + result.ReportSettings.PrintedOn;
return View();
}
专用异步任务DoGetReportDataColumnSettingsAsync(AdminTechnician报告输入,布尔同步)
{
input.CustomerId=m_CustomerId;
input.UserId=m_UserId;
input.TimeOffset=m_TimeOffset;
TReportReturn objTReportReturn=新的TReportReturn();
objTReportReturn.ReportColumns=等待新的ReportsEntityContext().GetTechniciansReportColumns(输入,同步);
objTReportReturn.ReportSettings=等待新的ReportsEntityContext().GetGeneralSettingsData(输入,同步);
objTReportReturn.ReportData=等待新的ReportsDbContext().GetUserL