Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
Multithreading C#第三方物流任务-一次有多少任务_Multithreading_C# 4.0_Task Parallel Library - Fatal编程技术网

Multithreading C#第三方物流任务-一次有多少任务

Multithreading C#第三方物流任务-一次有多少任务,multithreading,c#-4.0,task-parallel-library,Multithreading,C# 4.0,Task Parallel Library,我正在学习如何使用TPL对我拥有的应用程序进行parellizing。应用程序处理ZIP文件,提取其中保存的所有文件,并将内容导入数据库。在给定的时间内,可能有数千个zip文件等待处理 我是否正确地为这些ZIP文件启动了一个单独的任务,或者这是一种使用TPL的低效方法 谢谢。只要您有一个长时间运行的进程,您通常可以通过为每个输入任务创建不同的线程来在多处理器系统上获得额外的性能。所以我想说,您很可能走的是正确的道路。这似乎是一个更适合由线程池而不是TPL管理的工作线程(每个文件有单独的线程)的问

我正在学习如何使用TPL对我拥有的应用程序进行parellizing。应用程序处理ZIP文件,提取其中保存的所有文件,并将内容导入数据库。在给定的时间内,可能有数千个zip文件等待处理

我是否正确地为这些ZIP文件启动了一个单独的任务,或者这是一种使用TPL的低效方法


谢谢。

只要您有一个长时间运行的进程,您通常可以通过为每个输入任务创建不同的线程来在多处理器系统上获得额外的性能。所以我想说,您很可能走的是正确的道路。

这似乎是一个更适合由线程池而不是TPL管理的工作线程(每个文件有单独的线程)的问题。当您可以在单个数据项上分而治之,但您的zip文件是单独处理的时,TPL是非常棒的


磁盘I/O将成为您的瓶颈,因此我认为您需要限制同时运行的作业数。使用工作线程来管理这一点很简单,但我不确定您对for的并行有多大的控制(如果没有的话),因为并行如何一次进行,这可能会阻塞您的进程并实际降低它的速度。

我认为这将取决于进程是否受到CPU或磁盘的限制。如果进程受到磁盘的限制,我认为启动太多线程可能是个坏主意,因为各种提取可能只是相互竞争


这感觉像是你可能需要衡量的东西,以获得最佳的正确答案。

我不同意这里的某些说法

首先,我认为线程池和任务在协调或控制方面没有任何区别。特别是当任务在线程池上运行并且您可以轻松控制任务时,异常会在等待或等待任务期间很好地传播给调用方

其次,I/O不一定是这里唯一的瓶颈,这取决于数据和压缩级别。压缩可能比从光盘读取文件花费更多的时间

可以从很多方面考虑,但我最好选择CPU核数或更少的数量

将文件路径加载到ConcurrentQueue,然后允许正在运行的任务对文件路径进行出列、加载、压缩和保存

从那里你可以调整内核的数量,玩负载平衡

我不知道压缩期间ZIP是否支持文件分区,但在某些高级/复杂的情况下,这可能是一个好主意,尤其是在大型文件上


哇,这是一个6年前的问题,笨蛋!我没有注意到…:)

如果我将任务分割成线程,线程池会自动使用不同的内核吗?是的。关于线程池和多核机器的注意事项,请看这里:保罗,干杯,这篇文章准确地解释了我了解后的想法。这是一个有趣的观点。我一直认为第三方物流框架是未来的潮流,应该以同样的方式处理这种情况。数据库可能是主要的瓶颈,但我的推理是,在查询数据库时,其他核心可以将文件解压缩并准备就绪。我没有真正考虑磁盘I/O瓶颈,谢谢。效率很低!;)