C # пропустить оператор ожидания, чтобы разрешить выполнение текущего метода в веб-API - PullRequest
0 голосов
/ 04 апреля 2019

У меня есть асинхронный метод в моей службе Web API Do() и асинхронный метод DoAsideStuff(), который выполняется внутри первого:

public async Task<MyModel> Do(MyRequestModel model){
    //do some important stuff that must be awaited
    await DoImportantStuff();

   //do some aside operations that shouldn't prevent current method execution
    DoAsideStuff(model);

    //do some other important things and return result
    return someResult;
}

private async Task DoAsideStuff(MyRequestModel model)
{
    try{
        //make some http calls, no result needs to be returned
    }
    catch{}
}

Я хотел бы разрешить выполнение метода Do() безожидание результата от внутреннего звонка DoAsideStuff().Похоже, что приведенный выше код работает нормально, но я хотел бы знать, могут ли возникнуть какие-либо возможные побочные эффекты в случае большой нагрузки на метод Do () (например, 1000 в секунду)?

1 Ответ

1 голос
/ 04 апреля 2019

Похоже, что приведенный выше код работает нормально

Это почти всегда плохая идея.Основная проблема в том, что ваше приложение не знает, когда этот код завершится.В частности, если он завершает с исключением , то это исключение будет тихо проглочено.Также из-за утилизации фоновая работа может бесшумно исчезнуть.Кроме того, когда методы async возобновляются, они берут потоки из пула потоков, и это может помешать эвристике пула потоков ASP.NET, если это сделано много.Кроме того, если вы используете ASP.NET Classic (не Core), то метод async может попытаться возобновить работу в контексте запроса ASP.NET, который уже был удален / переработан, что может вызвать некоторые странные ошибки - вы 'Я хочу убедиться, что DoAsideStuff выполняется без a SynchronizationContext, если вы работаете в ASP.NET Classic.

Если эти ограничения приемлемы, то единственный дополнительный побочный эффект, когдапод нагрузкой все это усложняется: вы будете молча проглатывать больше исключений, молчать больше работы и больше вмешиваться в эвристику пула потоков ASP.NET.

...