¿Es posible obtener un buen seguimiento de pila con métodos asíncronos .NET?
Tengo la siguiente configuración de código de muestra en una aplicación 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!");
}
Tristemente, cuando GetValueAction es golpeado, el seguimiento de la pila que regresa es:
" 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"
Por lo tanto, obtengo (destrozado) GetValue2 y GetValue en la traza, pero ninguna mención de GetValueAction. ¿Estoy haciendo algo mal? ¿Hay otro patrón que me proporcione más trazas de pila completas?
EDITAR: mi objetivo no es escribir el código que se basa en el seguimiento de la pila, sino hacer errores en los métodos asíncronos más fáciles de depurar.