É possível obter um bom rastreamento de pilha com os métodos assíncronos do .NET?
Eu tenho a seguinte configuração de código de exemplo em um aplicativo 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!");
}
Infelizmente, quando GetValueAction é atingido, o rastreamento de pilha que retorna é:
" 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"
Assim, recebo (mutilado) GetValue2 e GetValue no rastreamento, mas nenhuma menção de GetValueAction. Estou fazendo algo errado? Existe outro padrão que me trará traços de pilha mais completos?
EDIT: meu objetivo não é escrever código baseando-se no rastreamento de pilha, mas sim fazer com que as falhas nos métodos assíncronos sejam mais fáceis de depurar.