在RESTful Web Api请求上运行后台线程

时间:2014-06-17 20:28:04

标签: c# asp.net multithreading asynchronous task

后台工作流程: 我有一个客户端(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关键字,它也可以。 (但后来我调用了调用者块)

解决方案是什么? 即使主线程已经死亡,创建后台任务/线程以执行代码的最佳方法是什么?

1 个答案:

答案 0 :(得分:3)

解决方案取决于您希望工作的可靠性。即,如果您返回“不可用”消息,GetEncounters将会对您有多重要?

您至少应该注册ASP.NET的后台工作(即HostingEnvironment.QueueBackgroundWorkItem)。更可靠的解决方案可以节省存储中的后台工作,并具有独立的后端进行处理。我描述了some modern approaches on my blog