Код: Выделить всё
public static async Task CallBackMethod(HttpRequestMessage request, string entityId, Func getEntity, Func action, string actionId) where T : Meta
{
// Changing to ConfigureAwait(true) ensures no Stackoverflow exception
request.Properties[Before] = await getEntity.Invoke(entityId).ConfigureAwait(false);
request.Properties[Target] = typeof(T).Name;
// Custom Exception is thrown from action.Invoke()
await action.Invoke().ConfigureAwait(false);
request.Properties[After] = (Func)(async () => await getEntity.Invoke(entityId).ConfigureAwait(false));
request.Properties[ActionId] = actionId;
}
Если я изменю первую строку в методе на < /p>
request.Properties[Before] = await getEntity.Invoke(entityId).ConfigureAwait(true)
< /code>
Тогда исключение Stackoverflow не брошено. Только ожидаемое пользовательское исключение брошено и обрабатывается.
Я думал, что в моем коде может быть какой -то рекурсивный вызов, но если я удвоил размер стека по умолчанию для моего приложения, то исключение Stackoverflow не брошено. Не в состоянии выяснить, что может вызвать исключение Stackoverflow. Я хотел понять, что меняется между ConfigureAwait (false) и True, что исключение StackOverflow не выбрасывается.
Минимальный пример Repro в этом репо
https://github.com/riteshksriv/testso
Подробнее здесь: https://stackoverflow.com/questions/794 ... sp-net-app