Найти атрибут родительского метода в глубоком асинхронном вызове - PullRequest
0 голосов
/ 08 сентября 2018

Я ищу способ "добавить некоторый контекст" в мои методы для целей отладки. Хотя использование StackTrace прекрасно работает с кодом синхронизации, при асинхронной работе все перестает работать. Я полностью понимаю, почему, но я не могу найти хороший способ решить эту проблему.

[Scope("method 1")]
private async Task Method1()
{
    // ... other awaited calls
    await DoWork();
}

[Scope("method 2")]
private async Task Method2()
{
    // ... other awaited calls
    await DoWork();
}

private async Task DoWork()
{
    // Get ScopeAttribute from parent method
    var description = new StackTrace()
      .GetFrames()
      ?.SelectMany(f => f.GetMethod().GetCustomAttributes(typeof(ScopeAttribute), false))
      .Cast<ScopeAttribute>()
      .FirstOrDefault()?.Description;
}

Как добраться до ScopeAttribute оформленного по родительским методам? В мире синхронизации вышеприведенное просто сработает. В асинхронном мире трассировка стека теряется. Есть идеи?

Решение не обязательно должно включать использование атрибутов.

1 Ответ

0 голосов
/ 08 сентября 2018

Если я правильно понимаю ваш сценарий использования, то вы ищете AsyncLocal:

private static AsyncLocal<string> _scope = new AsyncLocal<string>();

private async Task Method1()
{
    _scope.Value = "method 1";

    // ... other awaited calls
    await DoWork();
}

private async Task Method2()
{
    _scope.Value = "method 2";

    // ... other awaited calls
    await DoWork();
}

private async Task DoWork()
{
    Console.WriteLine(_scope.Value);
}
...