Запуск фонового потока по запросу RESTful WebApi

1

Фоновый рабочий процесс: у меня есть клиент (jquery/ajax html page), вызывающий наш 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;
   }

Вопрос: Что происходит при вызове "GetEncounters" выше, где не применяется ключевое слово ожидания? Насколько я понимаю, методы async НЕ генерируют новый поток, поэтому, когда основной поток умирает, означает ли это, что вызов GetEncounters будет отменен? (За кулисами GetEncounters будут запускать длительный процесс, чтобы получать данные и хранить их, например, кеш, для последующего извлечения).

Если я пройду через код, каждый будет выполняться так, как ожидалось. Аналогично, если я добавляю ключевое слово ожидания, оно также работает. (Но затем я делаю блок вызывающего абонента)

Какое решение? т.е. какой лучший способ создать фоновое задание/поток для выполнения кода, даже если основной поток умер?

Теги:
multithreading
asynchronous
task

1 ответ

3
Лучший ответ

Решение зависит от того, насколько надежна ваша работа. Т.е., если вы GetEncounters сообщение "недоступно", насколько важно для вас, что GetEncounters будет работать?

Вы должны, по крайней мере, зарегистрировать фоновое взаимодействие с ASP.NET (то есть HostingEnvironment.QueueBackgroundWorkItem). Более надежное решение позволит сохранить фоновые работы в хранилище и иметь независимый бэкэнд для обработки. Я описываю некоторые современные подходы в своем блоге.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню