Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/326.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# 使用线程池进行对象同步_C#_Multithreading_Parallel Processing_Threadpool - Fatal编程技术网

C# 使用线程池进行对象同步

C# 使用线程池进行对象同步,c#,multithreading,parallel-processing,threadpool,C#,Multithreading,Parallel Processing,Threadpool,我有多个处理器对象,我使用ThreadPool在并行进程中使用它们。我将使用哪个处理器基本上取决于传入的数据,可能有2000多种不同的类型;因此,只要我的应用程序运行,它就会在字典中创建1-2K个处理器,并根据线程池中的传入数据运行我需要的处理器。顺便说一句,任何进程都不会超过一毫秒 我在线程池中运行的psuedo代码如下: public void onIncomingNewData(rawData) { if (!ThreadPool.QueueUserWorkItem(proces

我有多个处理器对象,我使用ThreadPool在并行进程中使用它们。我将使用哪个处理器基本上取决于传入的数据,可能有2000多种不同的类型;因此,只要我的应用程序运行,它就会在字典中创建1-2K个处理器,并根据线程池中的传入数据运行我需要的处理器。顺便说一句,任何进程都不会超过一毫秒

我在线程池中运行的psuedo代码如下:

public void onIncomingNewData(rawData)
{
     if (!ThreadPool.QueueUserWorkItem(processors[rawData.Type.Id].Process, rawData))
     {
         Console.WriteLine("Work item cannot be queued!");
      }

      //Thread.Sleep(1);
}
我这里的问题是同步处理器对象;他们有自己的内部缓存,我不希望多个线程运行相同的进程对象进程方法


目前,我在process方法内部使用“lock”,以及process方法调用的一些其他私有方法。但实现这一点的最佳方法是什么?

您基本上需要的是基于类型的处理器池。不要在processors字典中缓存实际的处理器,而是创建一个池类来跟踪可用的和活动的处理器。当请求传入时,找到相应的池。然后查看是否有可用的处理器。如果是这样,请将其从可用列表中取出并放入活动列表中。运行Process方法,然后将其从活动列表中取出并放入可用列表中

您可以不使用活动/可用列表,而只使用活动标志。根据并发进程的数量,这可能更有效

然而,如果每个进程调用只需要一毫秒,那么对于您的特定需求来说,这听起来像是矫枉过正。我建议使用lock()进行同步,并添加一些日志记录,以查看进程等待锁的频率。如果在测试中您发现这是一个问题,那么继续进行更复杂的测试


您可能还需要锁定对
处理器
字典的访问,除非它已经是线程安全的。如果字典是100%预加载的,可能就没有必要了。

您基本上需要的是基于类型的处理器池。不要在processors字典中缓存实际的处理器,而是创建一个池类来跟踪可用的和活动的处理器。当请求传入时,找到相应的池。然后查看是否有可用的处理器。如果是这样,请将其从可用列表中取出并放入活动列表中。运行Process方法,然后将其从活动列表中取出并放入可用列表中

您可以不使用活动/可用列表,而只使用活动标志。根据并发进程的数量,这可能更有效

然而,如果每个进程调用只需要一毫秒,那么对于您的特定需求来说,这听起来像是矫枉过正。我建议使用lock()进行同步,并添加一些日志记录,以查看进程等待锁的频率。如果在测试中您发现这是一个问题,那么继续进行更复杂的测试


您可能还需要锁定对
处理器
字典的访问,除非它已经是线程安全的。如果字典是100%预加载的,则可能没有必要。

与其将处理器方法注入线程池,不如让每个处理器维护自己的请求队列,并将自己的工作方法注入线程池。

与其将处理器方法注入线程池,相反,让每个处理器维护自己的请求队列,并将自己的辅助方法注入线程池。

取决于“同步”的含义。此同步的目标是什么?取决于“同步”的含义。这种同步的目标是什么?同意-这听起来很像里德·科佩(Reed Copsey)最近在博客上提到的一个问题。他的答案是使用.NET4.0中提供的实例级线程本地存储。如果您还没有使用4.0,那么池可能是最好的解决方案。正如里德发现的那样,锁定共享流程数据可以抵消并行化带来的性能提升,特别是对于如此快速的操作。同意-这听起来很像里德·科佩最近(at)在博客中提到的一个问题。他的答案是使用.NET4.0中提供的实例级线程本地存储。如果您还没有使用4.0,那么池可能是最好的解决方案。正如里德发现的那样,锁定共享流程数据可以抵消并行化带来的性能提升,特别是对于这样快速的操作。