【问题标题】:implementing custom object to behave like cultureInfo in System.Threading.Thread.CurrentThread.CurrentCulture实现自定义对象的行为类似于 System.Threading.Thread.CurrentThread.CurrentCulture 中的cultureInfo
【发布时间】:2019-08-04 03:48:08
【问题描述】:

我有一个负责执行后台任务的服务。 每个任务都有一些数据库交互,并且必须有自己的连接字符串才能连接到不同的数据库。为了处理这种情况,我为每个任务创建了新线程,并且我有一个共享字典来存储 threadid 和自己的连接字符串(当我想运行任务时,我知道连接字符串)。我的数据访问层负责处理来自网络、移动设备、此服务等的请求以及一个管理器以获取正确的连接字符串(此服务除外,它返回静态连接字符串,对于此服务,它从 CurrentThread 获取线程 ID,因此它具有连接字符串)。我的要求是使用Task.Run() 而不是New Thread() 并在某些方法中使用Task.Run() 并在相关方法中使用async 方法所以我失去了使用共享字典的能力,因为每个任务都运行并且在某些情况下每个异步方法都有他们自己的threadid。我没有足够的时间来实施正确解决方案的策略模式。我做了一些研究和测试,所以我发现System.Threading.Thread.CurrentThread.CurrentCulture 中的CultureInfo 属性可以在父任务中更改,所有子方法(包括异步方法和使用Task.Run 的方法)使用更改后的 CultureInfo 而其他线。所以每个父任务及其子任务都有自己的 CultureInfo。我想要一些具有确切行为的东西。我试图扩展 CultureInfo,但在子线程中我无法访问它们。我尝试使用System.Threading.Thread.CurrentContext.SetProperty 当前上下文被冻结。我尝试使用 ActionBlock ;它也没有用。有人知道我的问题吗?

【问题讨论】:

  • ConcurrentDictionary 是您正在寻找的机器人吗? docs.microsoft.com/en-us/dotnet/api/…
  • @Christopher 想象我在一个异步方法中,我对我的主线程没有任何线索,所以我没有机会获取我的相关连接字符串,具有相关连接字符串的对象必须在不影响其他线程的情况下从主线程流向所有子线程
  • 无论您如何进行多任务处理,您进行 MT 处理的东西都会有某种 ID。那个可以用作 CuncurrentDictionary 的 Key。由于 key 是唯一的并且 Dictionary 是并发的,所以不会出现任何问题。

标签: c# multithreading


【解决方案1】:

我认为您在使用 AsyncLocal。 Stephan Cleary 解释了这个概念:

https://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html

在您理解了这个概念之后,这个答案应该适合您的需求:How do the semantics of AsyncLocal differ from the logical call context?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-22
    • 2010-09-11
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 2014-02-12
    相关资源
    最近更新 更多