【发布时间】:2016-08-02 13:54:11
【问题描述】:
我对异步 Web API 编程有非常基本的基本疑问。我想在我的控制器中异步调用 SaveCaseSearch。但是调用会经过DAL的各个层,最终调用DB。
这些连续调用也应该异步进行吗?
我对异步世界很陌生,所以我可能已经犯了一些错误。如果有任何问题,请纠正我。
所以对于控制器,我正在做类似下面的事情:
/*Create API for Case*/
[HttpPost]
[Route("createcase")]
public IHttpActionResult PostCreateCase([FromBody] ARC.Donor.Business.Case.CreateCaseInput CreateCaseInput)
{
ARC.Donor.Service.Case.CaseServices cs = new ARC.Donor.Service.Case.CaseServices();
var searchResults = cs.createCase(CreateCaseInput);
List<CreateCaseOutput> searchOutputResults = (List<CreateCaseOutput>)searchResults;
if (!string.IsNullOrEmpty(searchOutputResults.ElementAt(0).o_case_seq.ToString()))
SaveCaseSearchDetails(SaveSearchInput); /*This should be called asynchronously*/
return Ok(searchResults);
}
这个
SaveCaseSearchDetails
现在需要在异步模式下调用。所以我写了:
[HttpPost]
public async Task<IHttpActionResult> SaveCaseSearchDetails([FromBody] ARC.Donor.Business.SaveSearchInput SaveSearchInput)
{
ARC.Donor.Service.Case.CaseServices cs = new ARC.Donor.Service.Case.CaseServices();
var searchResults = await cs.saveCaseSearchDetails(SaveSearchInput);
}
如果正确的话
连续调用也应该异步吗?
现在他们是
public IList<Entities.Case.SaveCaseSearchOutput> saveCaseSearch(ARC.Donor.Data.Entities.Case.SaveCaseSearchInput SaveCaseSearchInput)
{
Repository rep = new Repository();
string strSPQuery = string.Empty;
List<object> listParam = new List<object>();
SQL.CaseSQL.getCreateCaseParameters(SaveCaseSearchInput, out strSPQuery, out listParam);
var AcctLst = rep.ExecuteStoredProcedure<Entities.Case.SaveCaseSearchOutput>(strSPQuery, listParam).ToList();
return AcctLst;
}
是
SQL.CaseSQL.getCreateCaseParameters
方法需要以异步方式调用吗? 但在这种情况下,紧接着的下一行
rep.ExecuteStoredProcedure
不能成功执行吧?因为 strSPQuery 来自上一行本身?
我想错了?请纠正我。
【问题讨论】:
-
Should those consecutive calls also be made asynchronous ?是的,如果你想要“真正的”异步功能。 -
但是在那种情况下,就像我描述的最后一种情况一样,它会坏吗?
-
你期望“异步”做什么?除非阻塞操作是它们自己异步的,否则你仍然需要阻塞一个线程来运行它们。
标签: c# asynchronous asp.net-web-api async-await