后台工作流程: 我有一个客户端(jquery / ajax html页面)调用我们的RESTful WebAPI来获取一些数据(患者'遇到' - 例如进入医院,访问诊所等)。 e.g。
public async Task<string> GetEncounters(string patientId)
{
PatientChart patientChart = await _myService.GetPatientChart(patientId);
string message = string.Empty;
if (patientChart.Encounters.Status == PatientChart.StatusNotApplicable)
{
message = "List of Encounters is not available. A request has been made to retrieve it.";
_myService.GetEncounters(patientId); // async method without call to await
}
return message;
}
问题 上面没有应用await关键字的“GetEncounters”调用会发生什么? 根据我的理解,异步方法不会生成新线程 所以当主线程死亡时,这是否意味着对GetEncounters的调用将中止? (在幕后,GetEncounters将启动一个长时间运行的进程来获取数据并将其存储在例如缓存中,以便以后检索。)
如果我单步执行代码,则每个代码都按预期执行。同样,如果我添加await关键字,它也可以。 (但后来我调用了调用者块)
解决方案是什么? 即使主线程已经死亡,创建后台任务/线程以执行代码的最佳方法是什么?
答案 0 :(得分:3)
解决方案取决于您希望工作的可靠性。即,如果您返回“不可用”消息,GetEncounters
将会对您有多重要?
您至少应该注册ASP.NET的后台工作(即HostingEnvironment.QueueBackgroundWorkItem
)。更可靠的解决方案可以节省存储中的后台工作,并具有独立的后端进行处理。我描述了some modern approaches on my blog。