代码之家  ›  专栏  ›  技术社区  ›  wpfwannabe

在深度异步调用中查找父方法的属性

  •  2
  • wpfwannabe  · 技术社区  · 6 年前

    我正在寻找一种方法来“添加一些上下文”到我的方法中,以达到调试的目的。即使使用 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 回复  |  直到 6 年前
        1
  •  2
  •   Kevin Gosse    6 年前

    如果我正确理解了您的用例,那么您需要的是 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);
    }