Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET异步框架-线程本地数据是否有限制_C#_Multithreading_Asynchronous_Thread Safety_Async Await - Fatal编程技术网

C# .NET异步框架-线程本地数据是否有限制

C# .NET异步框架-线程本地数据是否有限制,c#,multithreading,asynchronous,thread-safety,async-await,C#,Multithreading,Asynchronous,Thread Safety,Async Await,我期待着写一个Windows服务,将启动各种“工作” 每个“工作”将: 在它完成的事情上要清楚 在服务的生命周期内运行,因此“长时间运行”。通常,一个作业将从数据库中获取10个任务并对其进行处理,然后休眠,然后一次又一次地重复此周期 共享相同的“上下文”。应用程序将松散耦合,并调用IoC来获取类。它还将在此上下文中存储一些数据 我需要每个作业能够并行运行,并作为单独的程序有效运行 我的第一个想法是为每个作业创建一个线程。这是可以的,但有一个缺点,即ManualResetEvent会停止线程的

我期待着写一个Windows服务,将启动各种“工作”

每个“工作”将:

  • 在它完成的事情上要清楚
  • 在服务的生命周期内运行,因此“长时间运行”。通常,一个作业将从数据库中获取10个任务并对其进行处理,然后休眠,然后一次又一次地重复此周期
  • 共享相同的“上下文”。应用程序将松散耦合,并调用IoC来获取类。它还将在此上下文中存储一些数据
我需要每个作业能够并行运行,并作为单独的程序有效运行

我的第一个想法是为每个作业创建一个线程。这是可以的,但有一个缺点,即ManualResetEvent会停止线程的运行,并且中止不允许线程以优雅的方式退出

然后,我在.NET4.5中探索了一些新的异步框架,它似乎简化了编码

然而,虽然上下文中的一些数据可以在每个作业之间自由共享,但有些不能:因此每个作业都需要自己的特定数据副本

我尝试使用ThreadLocal属性解决此问题。然而,虽然这对我创建的特定线程很好,但对异步方法不起作用。启动异步方法的线程通常不是完成该方法的线程,特别是当该方法使用“wait”时

那么,我想要实现的目标的首选模式是什么


仅供参考:发布非常有帮助。

与其在线程之间共享对象(或静态对象)的threadlocal属性,不如不要在线程之间共享对象。让每个作业在作用域中创建自己的存储位置(即对象实例),以便其他作业永远无法访问它们。同意@Servy。你已经有了一个IoC——为什么不直接使用它呢?并不是说数据不能共享(虽然我说的是“不要共享可变数据”),我认为这里的问题是不能通过一些“聚合[根]”提供所有相关数据,这些“聚合[根]”可以与任务“重新关联”。顾名思义,线程局部变量仅适用于以严格的1-1线程任务对应关系保存数据..将参数传递给方法是将参数传递给方法的传统方式。。。为什么要尝试使用线程本地存储?你有什么特别的问题?