C# 使异步本地更改传播到调用函数
dotnetfiddle链接 我有以下示例代码来演示异步本地功能C# 使异步本地更改传播到调用函数,c#,asynchronous,async-await,configureawait,C#,Asynchronous,Async Await,Configureawait,dotnetfiddle链接 我有以下示例代码来演示异步本地功能 static AsyncLocal<string> _asyncLocalString = new AsyncLocal<string>(); public static async Task Main() { // _asyncLocalString.Value = "Value 1"; var t1 = AsyncMethodA(); va
static AsyncLocal<string> _asyncLocalString = new AsyncLocal<string>();
public static async Task Main()
{
// _asyncLocalString.Value = "Value 1";
var t1 = AsyncMethodA();
var t2 = AsyncMethodB();
await Task.WhenAny(t1, t2).ConfigureAwait(false);
Console.WriteLine("Finished");
Console.WriteLine("Async local inside Main: " + _asyncLocalString.Value); // null
}
static async Task AsyncMethodA()
{
// _asyncLocalString.Value = "Value 2";
Console.WriteLine("Method A");
Console.WriteLine("Async local inside A: " + _asyncLocalString.Value); // null
await Task.Delay(200);
}
static async Task AsyncMethodB()
{
_asyncLocalString.Value = "Value 3";
Console.WriteLine("Method B");
await AsyncMethodC().ConfigureAwait(false);
}
static async Task AsyncMethodC()
{
await Task.Delay(100);
Console.WriteLine("Method C");
Console.WriteLine("Async local inside C: " + _asyncLocalString.Value); // Value 3 is printed
}
有没有一种方法可以将这些更改传播到调用堆栈中,以便B中的异步本地更改在a和main中可见
我的真实场景与上面的场景类似——asyncLocal仅在methodB中设置,我们在调用堆栈上有几个语句,它们以不同的方式记录该值
有没有一种方法可以将这些更改传播到调用堆栈中,以便B中的异步本地更改在a和main中可见
不,不适用于AsyncLocal
,因此,如果将其写入,将创建一个副本。而且拷贝永远不会向上“流动”
你需要使用一些其他的机制来实现你想做的事情
Method B
Method C
Async local inside C: Value 3
Method A
Async local inside A:
Finished
Async local inside Main: