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:太棒了。我去看看。谢谢