gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:59:23 26 4
gpt4 key购买 nike

我正在寻找一种方法来为我的方法“添加一些上下文”以进行调试。即使使用 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?在同步世界中,上面的方法就可以了。在异步世界中,堆栈跟踪丢失了。有什么想法吗?

解决方案不一定非要使用属性。

最佳答案

如果我正确理解你的用例,你正在寻找的是 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);
}

关于c# - 在深度异步调用中查找父方法的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52236822/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com