62,046
社区成员
发帖
与我相关
我的任务
分享
class Program
{
private const string tmp1 = "Value 1";
private const string tmp2 = "Value 2";
private const string tmp3 = "Value 3";
static AsyncLocal<string> _asyncLocalString = new AsyncLocal<string>();
static ThreadLocal<string> _threadLocalString = new ThreadLocal<string>();
[ContextStatic]
private static string _attContextStr;
[ThreadStatic]
private static string _attThreadStr;
static void Main(string[] args)
{
AsyncMethodA();
Console.Read();
}
static async Task AsyncMethodA()
{
Console.WriteLine("Begin Test1.Thread Id:" + Thread.CurrentThread.ManagedThreadId);
SetValue(tmp1);
var t1 = AsyncMethodB(tmp1);
Console.WriteLine("Begin Test2.Thread Id:" + Thread.CurrentThread.ManagedThreadId);
SetValue(tmp2);
var t2 = AsyncMethodB(tmp2);
// Await both calls
await t1;
await t2;
SetValue(tmp3);
await AsyncMethodB(tmp3);
Console.WriteLine("End Test.Thread Id:" + Thread.CurrentThread.ManagedThreadId);
}
static void SetValue(string tmp)
{
CallContext.SetData("aa", tmp);
_attContextStr = tmp;
_attThreadStr = tmp;
_asyncLocalString.Value = tmp;
_threadLocalString.Value = tmp;
}
static async Task AsyncMethodB(string expectedValue)
{
Console.WriteLine("Entering AsyncMethodB.Thread Id:" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(" Expected '{0}', AsyncLocal '{1}', ThreadLocal '{2}', ContextAtt '{3}', ThreadAtt '{4}', CallContext '{5}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value, _attContextStr, _attThreadStr, CallContext.GetData("aa"));
await Task.Delay(100);
Console.WriteLine("Exiting AsyncMethodB.Thread Id:" + Thread.CurrentThread.ManagedThreadId);
Console.WriteLine(" Expected '{0}', AsyncLocal '{1}', ThreadLocal '{2}', ContextAtt '{3}', ThreadAtt '{4}', CallContext '{5}'",
expectedValue, _asyncLocalString.Value, _threadLocalString.Value, _attContextStr, _attThreadStr, CallContext.GetData("aa"));
}