Это из-за конструктивного поведения, поэтому вы должны спросить себя: «Правильно ли я это делаю?»
Существуют различные способы преодоления этой проблемы,Если вам нужен регистрируемый асинхронный вызов «запусти и забудь», вы можете заключить его в такой вызов.Но будьте осторожны, задача выполняется, вероятно, в другом контексте, поэтому у вас может не быть доступа к типичным переменным, связанным с контекстом, таким как ваш текущий HttpContext (и тому подобное).
Task.Run(async () =>
{
try
{
logger.VerboseRequest(tokenParameters.Endpoint, payloadJson, options);
serializedResponse = await httpHandler.PostAsync<string>
(tokenParameters.Endpoint, payloadJson, options, cts.Token);
}
catch (TaskCanceledException)
{
throw new TokenTimeoutException();
}
catch (Exception ex)
{
logger.Error(String.Format("Error when posting to Endpoint: {0}",ex.Message));
throw;
}
}).ConfigureAwait(false);
Или дажелучше: оберните его в функцию
async Task DoStuff()
{
try
{
logger.VerboseRequest(tokenParameters.Endpoint, payloadJson, options);
serializedResponse = await httpHandler.PostAsync<string>
(tokenParameters.Endpoint, payloadJson, options, cts.Token);
}
catch (TaskCanceledException)
{
throw new TokenTimeoutException();
}
catch (Exception ex)
{
logger.Error(String.Format("Error when posting to Endpoint: {0}",ex.Message));
throw;
}
}
И где ваш текущий код:
async Task WhereYouAreDoingStuff()
{
DoStuff().ConfigureAwait(false);
}