Czy możliwe jest uzyskanie dobrego śledzenia stosu za pomocą metod asynchronicznych .NET?
Mam następującą przykładową konfigurację kodu w aplikacji 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!");
}
Niestety, gdy GetValueAction zostanie trafiony, ślad stosu, który powraca, to:
" 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"
W ten sposób otrzymuję (zniekształcone) GetValue2 i GetValue w śladzie, ale bez wzmianki o GetValueAction. czy robię coś źle? Czy istnieje inny wzór, który pozwoli mi uzyskać pełniejsze ślady stosu?
EDYTUJ: moim celem nie jest pisanie kodu opartego na śledzeniu stosu, ale raczej ułatwi debugowanie błędów w metodach asynchronicznych.