Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.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

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 - Fatal编程技术网

大型线程任务处理程序的C#核心实现

大型线程任务处理程序的C#核心实现,c#,multithreading,C#,Multithreading,我正在用C#写一个网页刮板。我使用Thread对象实现它,这些对象从任务池中获取工作,并根据回调处理所有这些元素,并存储结果。任务池意味着5K-50K个输入URL 是否有任何核心框架对象可以处理类似的问题?我试图查看线程池是否可以实例化,但它不能。我也非常不确定是否可以/应该将如此多的任务排入默认的线程池 那么,核心中是否已经有任何东西可用于创建大量任务和线程,并让这些线程处理这些任务?还是我应该坚持我自己的。自从我使用C#以来,我已经重新发明了一些轮子 是的,有 任务并行库(TPL) 任务并

我正在用C#写一个网页刮板。我使用
Thread
对象实现它,这些对象从任务池中获取工作,并根据回调处理所有这些元素,并存储结果。任务池意味着5K-50K个输入URL

是否有任何核心框架对象可以处理类似的问题?我试图查看
线程池是否可以实例化,但它不能。我也非常不确定是否可以/应该将如此多的任务排入默认的
线程池

那么,核心中是否已经有任何东西可用于创建大量任务和线程,并让这些线程处理这些任务?还是我应该坚持我自己的。自从我使用C#以来,我已经重新发明了一些轮子

是的,有

任务并行库(TPL) 任务并行库(TPL)是System.Threading和System.Threading.Tasks命名空间中的一组公共类型和API。TPL的目的是简化向应用程序添加并行性和并发性的过程,从而提高开发人员的工作效率。TPL动态扩展并发度,以最有效地使用所有可用的处理器。此外,TPL处理工作分区、线程池上线程的调度、取消支持、状态管理和其他低级细节。通过使用TPL,您可以最大限度地提高代码的性能,同时专注于程序设计要完成的工作

默认情况下,任务使用TaskScheduler排队到线程池中。调度器的作用是促进有效使用可用线程和处理器

您可能还对它上面的数据流API感兴趣

数据流 此数据流模型通过为粗粒度数据流和流水线任务提供进程内消息传递来促进基于参与者的编程。数据流组件构建在TPL的类型和调度基础设施上,并与C#、Visual Basic和F#语言支持集成,以实现异步编程。当您有多个必须彼此异步通信的操作时,或者当您希望在数据可用时处理数据时,这些数据流组件非常有用


不要用多线程来做。实现单线程异步。PS问题是线程池是单例的。@Aron异步对象的限制是什么?我已经考虑过了,但是如果每一个都产生一个新的线程。。。结束了。:)如果设置了上限,异步的线程限制是多少?@Aron在WinAPI中有一个类似的线程池,可以有多个实例。我说的是“单线程异步”。这意味着一个线程。@Aron所以我在一个线程上启动了很多异步对象,然后等待它们。。。?我来自C++。所有这些异步的东西让我在思考的时候头晕目眩。。。有多少线程,多少内存,多快,多高效。。。我不知道幕后发生了什么。这将是并行的?如果是这样,线程数是多少?
Parallel.ForEach
将决定自己旋转多少线程。但是,您可以使用其中一个重载覆盖默认行为。不过,我建议您在web调用中使用异步I/O,并在处理过程中运行
任务。然后使用
wait Task.whalll
从所有刮取的数据中获取所有结果。@CodeAngry如果您可以信任任务计划程序充分利用可用的内核,线程数是否重要?网络中的数据包冲突可能会对吞吐量造成更大的限制。@code我还建议通过
Parallel.ForEach
进行数据流。您的项目是一个完美的候选人。@Gusdor谢谢您!我也这么认为。我现在正在读它。