Простой способ запустить и забыть вызовы SignalR в Netcore 3.1 - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть веб-сервис. 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);
        }
    }

1 Ответ

2 голосов
/ 30 апреля 2020

Будет ли реализация функции фоновой очереди работ, описанной в MSDN, способом go для этого? Или я обдумываю это, и мне следует просто отказаться от Задачи?

Фоновая очередь даст вам «максимальные усилия» при выполнении кода. Фоновая очередь дает вам возможность взаимодействовать с процессом хостинга и будет задерживать завершение работы, если возможно, для запуска кода. Тем не менее, если это просто не так важно, отменить задачу будет проще.

будет ли основной обмен сообщениями работать так же, если я изменю вещи таким образом

Да. MethodAsync(); совпадает с _ = MethodAsync();. Обе строки будут вызывать метод, а затем игнорировать возвращенную задачу. Единственное отличие заключается в явном отбрасывании (_), которое, по сути, означает, что вы говорите компилятору: «Да, я знаю, что эта задача не ожидалась, и я делаю ее специально».

...