Можно ли получить хорошую трассировку стека с помощью асинхронных методов .NET?

У меня есть следующий пример настройки кода в приложении WebApi:

[HttpGet]
public double GetValueAction()
{
    return this.GetValue().Result;
}

public async Task GetValue()
{
    return await this.GetValue2().ConfigureAwait(false);
}

public async Task GetValue2()
{
    throw new InvalidOperationException("Couldn't get value!");
}

К сожалению, когда GetValueAction получает удар, трассировка стека, которая возвращается:

    " at MyProject.Controllers.ValuesController.d__3.MoveNext() in c:\dev\MyProject\MyProject\Controllers\ValuesController.cs:line 61 --- End of stack trace from previous location where exception was thrown --- 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.ConfiguredTaskAwaitable`1.ConfiguredTaskAwaiter.GetResult()
at MyProject.Controllers.ValuesController.d__0.MoveNext() in c:\dev\MyProject\MyProject\Controllers\ValuesController.cs:line 56"

Таким образом, я получаю (искалеченные) GetValue2 и GetValue в трассировке, но не упоминаю GetValueAction. Я делаю что-то неправильно? Есть ли другой паттерн, который даст мне более полные следы стека?

РЕДАКТИРОВАТЬ: моя цель не в том, чтобы писать код, основанный на трассировке стека, а вместо этого, чтобы упростить отладку ошибок в асинхронных методах.

Ответы на вопрос(3)

Ваш ответ на вопрос