当我调用WrapperAsync时,AsyncLocalContext.Value返回null。当我在方法外部运行相同的代码块时,在Main方法中,AsyncLocalContext.Value不是空的(这正是我所期望的)。
功能是完全相同的,但结果是不同的。这是Asynclocal类的错误,还是有其他解释?
internal class Program
{
private static readonly AsyncLocal<string> AsyncLocalContext = new AsyncLocal<string>();
private static void Main()
{
const string text = "surprise!";
WrapperAsync(text).Wait();
Console.WriteLine("Get is null: " + (AsyncLocalContext.Value == null));
// AsyncLocalContext.Value is null
var value = GetValueAsync(text).Result;
AsyncLocalContext.Value = value;
Console.WriteLine("Get is null: " + (AsyncLocalContext.Value == null));
// AsyncLocalContext.Value is not null
Console.Read();
}
private static async Task WrapperAsync(string text)
{
var value = await GetValueAsync(text);
AsyncLocalContext.Value = value;
}
private static async Task<string> GetValueAsync(string text)
{
await Task.Delay(0);
return text;
}
}发布于 2018-03-12 10:17:41
遵循这个链接MSDN上的AsyncLocal类
AsyncLocal<T>表示给定异步控制流(例如异步方法)的本地环境数据。
这意味着代码在从另一个async方法(如WrapperAsync )访问时使用不同的值,并且主线程包含另一个值
更新
不明显的事情,理解,但这是解释。异步程序中的控制流。当您不期望这样做时,您的线程就是这样改变的。
这就是控制流如何使用async的方式
public class Program
{
private static readonly AsyncLocal<string> AsyncLocalContext = new AsyncLocal<string>();
public static void Main(string[] args)
{
AsyncLocalContext.Value = "No surprise";
WrapperAsync("surprise!");
Console.WriteLine("Main: " + AsyncLocalContext.Value);
}
private static async void WrapperAsync(string text)
{
Console.WriteLine("WrapperAsync before: " + AsyncLocalContext.Value);
AsyncLocalContext.Value = text;
Console.WriteLine("WrapperAsync after: " + AsyncLocalContext.Value);
}
}产出如下:
WrapperAsync before: No surprise
WrapperAsync after: surprise!
Main: No surprise/UPDATE
https://stackoverflow.com/questions/49232514
复制相似问题