在RESTful WebApi请求上运行后台线程
本文关键字:运行 后台 线程 请求 RESTful WebApi | 更新日期: 2023-09-27 18:09:14
我有一个客户端(jquery/ajax html页面)调用我们的RESTful WebAPI来获取一些数据(患者'遭遇' -例如入院,访问诊所等)。例如
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关键字,它也可以工作。(然后我让调用者阻塞)
解决方案是什么?也就是说,创建一个后台任务/线程来执行代码的最好方法是什么,即使主线程已经死亡?
解决方案取决于您希望工作有多可靠。也就是说,如果您返回"not available"消息,那么GetEncounters
是否会运行对您来说有多重要?
您至少应该在ASP中注册后台工作。NET(即HostingEnvironment.QueueBackgroundWorkItem
)。更可靠的解决方案是将后台工作保存在存储中,并有一个独立的后端进行处理。我在我的博客上描述了一些现代的方法。