【发布时间】:2015-07-14 23:47:42
【问题描述】:
我注意到CallContext.LogicalSetData/LogicalGetData 没有按照我预期的方式工作。在async 方法中设置的值会被恢复即使没有异步或任何类型的线程切换,无论如何。
这是一个简单的例子:
using System;
using System.Runtime.Remoting.Messaging;
using System.Threading;
using System.Threading.Tasks;
namespace ConsoleApplication
{
class Program
{
static async Task<int> TestAsync()
{
CallContext.LogicalSetData("valueX", "dataX");
// commented out on purpose
// await Task.FromResult(0);
Console.WriteLine(CallContext.LogicalGetData("valueX"));
return 42;
}
static void Main(string[] args)
{
using(ExecutionContext.SuppressFlow())
{
CallContext.LogicalSetData("valueX", "dataXX");
Console.WriteLine(CallContext.LogicalGetData("valueX"));
Console.WriteLine(TestAsync().Result);
Console.WriteLine(CallContext.LogicalGetData("valueX"));
}
}
}
}
它产生这个输出:
数据XX 数据X 42 数据XX如果我将 TestAsync 设为非异步,它会按预期工作:
static Task<int> TestAsync()
{
CallContext.LogicalSetData("valueX", "dataX");
Console.WriteLine(CallContext.LogicalGetData("valueX"));
return Task.FromResult(42);
}
输出:
数据XX 数据X 42 数据X如果我在 TestAsync 内部有一些真正的异步,我会理解这种行为,但这里不是这种情况。我什至使用ExecutionContext.SuppressFlow,但这并没有改变任何东西。
有人能解释一下为什么会这样吗?
【问题讨论】:
-
非常好!
标签: c# .net async-await task-parallel-library