Можно ли получить хорошую трассировку стека с помощью асинхронных методов .NET?
У меня есть следующий пример настройки кода в приложении WebApi:
[HttpGet]
public double GetValueAction()
{
return this.GetValue().Result;
}
public async Task<double> GetValue()
{
return await this.GetValue2().ConfigureAwait(false);
}
public async Task<double> GetValue2()
{
throw new InvalidOperationException("Couldn't get value!");
}
К сожалению, когда GetValueAction получает удар, трассировка стека, которая возвращается:
" at MyProject.Controllers.ValuesController.<GetValue2>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.<GetValue>d__0.MoveNext() in c:\dev\MyProject\MyProject\Controllers\ValuesController.cs:line 56"
Таким образом, я получаю (искалеченные) GetValue2 и GetValue в трассировке, но не упоминаю GetValueAction. Я делаю что-то неправильно? Есть ли другой паттерн, который даст мне более полные следы стека?
РЕДАКТИРОВАТЬ: моя цель не в том, чтобы писать код, основанный на трассировке стека, а вместо этого, чтобы облегчить отладку сбоев в асинхронных методах.