ConfigureAwait (false) теряет контекст объекта - PullRequest
0 голосов
/ 08 октября 2018

В моей программе я делаю запрос, и я регистрирую запрос и ответ.Но использование ConfigureAwait(false) может привести к потере контекста моего объекта "logger", который регистрирует запрос в одном файле, и ответа в другом файле.

try
{
    logger.VerboseRequest(tokenParameters.Endpoint, payloadJson, options);
    serializedResponse = await httpHandler.PostAsync<string>
                        (tokenParameters.Endpoint, payloadJson, options, cts.Token)
                        .ConfigureAwait(false);
}
catch (TaskCanceledException)
{
    throw new TokenTimeoutException();
}
catch (Exception ex)
{
    logger.Error(String.Format("Error when posting to Endpoint: {0}",ex.Message));
    throw;
}

Есть идеи, почему это происходит?Или что делать, чтобы избежать этого?

Удаляя ConfigureAwait(false), у меня могут возникнуть проблемы с TimeOut, так что это не вариант.

1 Ответ

0 голосов
/ 08 октября 2018

Это из-за конструктивного поведения, поэтому вы должны спросить себя: «Правильно ли я это делаю?»

Существуют различные способы преодоления этой проблемы,Если вам нужен регистрируемый асинхронный вызов «запусти и забудь», вы можете заключить его в такой вызов.Но будьте осторожны, задача выполняется, вероятно, в другом контексте, поэтому у вас может не быть доступа к типичным переменным, связанным с контекстом, таким как ваш текущий 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);
}
...