У меня есть веб-сервис. net ядро 3.1, которое довольно интенсивно использует SignalR. Исходный код просто вызывает методы, которые вызывают методы SignalR SendAsyn c, и, хотя, возможно, есть немного ненужного переноса задачи, в конечном счете, ничего не делается с любой задачей, связанной с вызовом SignalR:
//in the hub manager
public async Task ShowBanner(string group)
{
await _signalrHubContext.Clients.Group(group).SendAsync("showBanner");
}
//in the controller
[HttpGet("Show/Banner")]
public async Task<ActionResult> ShowBanner()
{
try {
//some other await-necessary db stuff here
await dbcontext.Blah....;
somehubmanager.ShowBanner(); //because this call is not awaited...
return Ok();
}
catch (Exception e)
{
return StatusCode((int)HttpStatusCode.InternalServerError, e.Message);
}
}
Что, естественно, приводит к большому количеству «потому что этот звонок не ожидается ...». Я хотел бы изменить этот сценарий, чтобы он «умышленно» запускался и забыл (нам действительно все равно, получает ли клиент / подчиняется ли ему указание показывать свой баннер или нет, мы не хотим ничего делать с ошибками, мы не хотим ждать каких-либо завершений, и нас не волнует, есть ли задачи ожидания, если сервер выключен - нам действительно важно, чтобы сообщения проверялись, если это возможно), и удаляем сотни предупреждений для этих конкретных случаев использования
Будет ли реализация функции фоновой рабочей очереди , подробно описанной в MSDN , способом для go для этого? Или я обдумываю это, и я должен просто отказаться от Задачи? Документы для SendAsyn c говорят "не ждет ...", и сейчас все работает приемлемо, но мне также любопытно, если это просто случайно, потому что SignalR работает быстрее / легче, чем требуется время завершить sh запрос на обслуживание; не могли бы мы в один прекрасный день достигнуть go, чтобы мы обнаружили, что этот запрос веб-службы завершается и завершается до того, как что-либо случится с обменом сообщениями SignalR, и сообщения даже не будут проверены (т. е. может ли хобман-менеджер области действия быть удален DI до вызова ShowBanner)
Я просто не уверен, как долго я должен "заботиться" о Задаче в специфическом c контексте SignalR; будет ли основной обмен сообщениями работать так же, если я изменю вещи таким образом:
public Task ShowBanner(string group)
{
return _signalrHubContext.Clients.Group(group).SendAsync("showBanner");
}
[HttpGet("Show/Banner")]
public async Task<ActionResult> ShowBanner()
{
try {
//some other await-necessary db stuff here
await dbcontext.Blah....;
_ = somehubmanager.ShowBanner();
return Ok();
}
catch (Exception e)
{
return StatusCode((int)HttpStatusCode.InternalServerError, e.Message);
}
}