C# 跨多个应用程序共享范围等待

C# 跨多个应用程序共享范围等待,c#,multithreading,task-parallel-library,async-await,C#,Multithreading,Task Parallel Library,Async Await,我有一个UserScope类,其功能类似于TransactionScope,即它将当前状态存储在本地线程中。当然,在.NET 4.5.1中添加了TransactionScopeAsyncFlowOption之前,对Wait的调用和TransactionScope的调用都不起作用 除了线程本地,我可以使用什么替代方案,以便在单线程和多线程场景中使用相同的UserScope?(如果我安装了4.5.1,我会进行反编译,看看TransactionScope是如何做到的。)这是我的简化版本: 类用户{ 只

我有一个
UserScope
类,其功能类似于
TransactionScope
,即它将当前状态存储在本地线程中。当然,在.NET 4.5.1中添加了
TransactionScopeAsyncFlowOption
之前,对
Wait
的调用和
TransactionScope
的调用都不起作用

除了线程本地,我可以使用什么替代方案,以便在单线程和多线程场景中使用相同的
UserScope
?(如果我安装了4.5.1,我会进行反编译,看看
TransactionScope
是如何做到的。)这是我的简化版本:

类用户{
只读字符串名称;
公共用户(字符串名称){
this.name=名称;
}
公共字符串名{
获取{返回this.name;}
}
}
类UserScope:IDisposable{
只读用户;
[线程静态]
静态用户范围currentScope;
公共用户范围(用户){
this.user=用户;
currentScope=这个;
}
公共静态用户{
获取{return currentScope!=null?currentScope.user:null;}
}
公共空间处置(){
///...
}
}
这是一个我希望能成功的测试:

静态异步任务测试(){
var user=新用户(“螺纹燧石”);
使用(新用户范围(用户)){
等待任务。运行(委托){
控制台。WriteLine(“与NRE碰撞…”);
WriteLine(“当前用户是:{0}”,UserScope.user.Name);
});
}
}
静态void Main(字符串[]参数){
Test().Wait();
Console.ReadLine();
}

在.NET 4.5完整框架中,您可以使用逻辑调用上下文:

static async Task Test()
{
    CallContext.LogicalSetData("Name", "Thread Flintstone");
    await Task.Run(delegate
    {
        //Console.WriteLine("Crashing with NRE...");
        Console.WriteLine("The current user is: {0}", CallContext.LogicalGetData("Name"));
    });
}

static void Main(string[] args)
{
    Test().Wait();
    Console.ReadLine();
}

但是,您应该只在逻辑调用上下文中存储不可变的数据。我有。我一直想把它打包成一个
AsyncLocal
库,但是(现在)还没有找到时间。

你不必安装.NET 4.5.1来查看它的源代码。进入。明确地我真的很喜欢它,做得好,微软:)@Noseratio:太棒了。我去看看。谢谢