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# 螺纹/第三方物流等_C#_Multithreading_C# 3.0_Task Parallel Library - Fatal编程技术网

C# 螺纹/第三方物流等

C# 螺纹/第三方物流等,c#,multithreading,c#-3.0,task-parallel-library,C#,Multithreading,C# 3.0,Task Parallel Library,我需要处理1600万条数据库记录,这将花费我一辈子的时间。我不懂穿线,所以我想在这里问一下。我的想法是,我需要执行以下操作,但不确定如何执行: 拿我的16m唱片 将它们分成若干“块” 将这些块中的每一个发送到线程上进行处理 这听起来对吗?我该如何分配我的工作量(1600万张唱片)等等 如果您能提供合理的建议,干杯。我建议您以以下方式使用著名的生产者-消费者模式: 单个线程(生产者)从数据库中提取记录,创建任务(处理单个或多个记录),并将它们放入共享队列中 一组线程(使用者)从队列中提取任务并并

我需要处理1600万条数据库记录,这将花费我一辈子的时间。我不懂穿线,所以我想在这里问一下。我的想法是,我需要执行以下操作,但不确定如何执行:

  • 拿我的16m唱片
  • 将它们分成若干“块”
  • 将这些块中的每一个发送到线程上进行处理
  • 这听起来对吗?我该如何分配我的工作量(1600万张唱片)等等


    如果您能提供合理的建议,干杯。

    我建议您以以下方式使用著名的生产者-消费者模式:

    • 单个线程(生产者)从数据库中提取记录,创建任务(处理单个或多个记录),并将它们放入共享队列中
    • 一组线程(使用者)从队列中提取任务并并行处理它们
    实现这一点的一个非常简单的方法是使用
    ThreadPool
    类。它可以方便地为您管理队列和工作人员。您只需通过
    QueueUserWorkItem
    实现生产者和队列任务


    或者,如果您想使用TPL结构,您可以自己使用
    任务
    的组合来实现上述机制,如果您想并行处理一组项目,则可以使用
    并发队列
    。您只需向它传递一个要对每个项执行的操作(可能是lambda),它将负责将集合拆分为块并执行它


    但你必须小心你在行动中投入了什么。这是因为代码将在更多线程上并发执行,因此您不应该以非线程安全的方式访问任何共享状态。

    一个问题:您用TPL标记了它,但也用C#3.0标记了它-但是TPL附带了.net4.0-因此您应该能够使用C#4.0-如果是这样,您可能会发现:interesting@CarstenK奥尼格,TPL数据流适用于更复杂的流。我不认为这在这种情况下有用。。。我认为这是一个合理的场景。你需要做什么样的处理?处理大量数据库记录的最佳位置是数据库本身。从数据库中取出数据并通过网络传输是非常昂贵的。TPL数据流简化了流处理。这不仅适用于复杂的数据流。为所有输入人员干杯,Panagiotis Kanavos,我正在从数据库中获取DB记录,从返回的数据构建一个XML文件,然后将此XML文件作为BLOb上载到Azure。这有点混乱。TPL构造是Products Consumer模式的实现——ConcurrentQueue甚至实现了IProducerConsumer接口。要使用ThredPool,您必须重新实现相同的机制。