草庐IT

tpl-dataflow

全部标签

c# - 如何确保数据流 block 仅按需创建线程?

我使用TPL数据流API编写了一个小型管道,它从多个线程接收数据并对其执行处理。设置1当我将其配置为使用MaxDegreeOfParallelism=Environment.ProcessorCount时(在我的例子中是8)对于每个block,我注意到它填满了多个线程中的缓冲区并且处理第二个block直到所有线程都接收到+-1700个元素才开始。你可以在行动中看到这个here.设置2当我设置MaxDegreeOfParallelism=1然后我注意到所有元素都在单个线程上接收,并且在接收到+-40个元素后已经开始处理发送。Datahere.设置3当我设置MaxDegreeOfParal

c# - 使用 blockingcollection 和 tasks 的经典生产者消费者模式 .net 4 TPL

请看下面的伪代码//SingleormultipleProducersproduceusingbelowmethodvoidProduce(objectitemToQueue){concurrentQueue.enqueue(itemToQueue);consumerSignal.set;}//somewhereelsewehavestartedaconsumerlikethis//wehaveonlyoneconsumervoidStartConsumer(){while(!concurrentQueue.IsEmpty()){if(concurrentQueue.TrydeQueu

c# - 使用 blockingcollection 和 tasks 的经典生产者消费者模式 .net 4 TPL

请看下面的伪代码//SingleormultipleProducersproduceusingbelowmethodvoidProduce(objectitemToQueue){concurrentQueue.enqueue(itemToQueue);consumerSignal.set;}//somewhereelsewehavestartedaconsumerlikethis//wehaveonlyoneconsumervoidStartConsumer(){while(!concurrentQueue.IsEmpty()){if(concurrentQueue.TrydeQueu

c# - TPL Dataflow,仅在所有源数据 block 完成时保证完成

当两个转换block都完成时,如何重写代码完成的代码?我认为完成意味着它被标记为完成并且“出队列”是空的?publicTest(){broadCastBlock=newBroadcastBlock(i=>{returni;});transformBlock1=newTransformBlock(i=>{Console.WriteLine("1inputcount:"+transformBlock1.InputCount);Thread.Sleep(50);return("1_"+i);});transformBlock2=newTransformBlock(i=>{Console.Wr

c# - TPL Dataflow,仅在所有源数据 block 完成时保证完成

当两个转换block都完成时,如何重写代码完成的代码?我认为完成意味着它被标记为完成并且“出队列”是空的?publicTest(){broadCastBlock=newBroadcastBlock(i=>{returni;});transformBlock1=newTransformBlock(i=>{Console.WriteLine("1inputcount:"+transformBlock1.InputCount);Thread.Sleep(50);return("1_"+i);});transformBlock2=newTransformBlock(i=>{Console.Wr

C# - 何时在高事件服务器中使用标准线程、ThreadPool 和 TPL

我最近阅读了很多关于线程的书籍,因为我正在寻求开发一个高性能、可扩展的TCP服务器,该服务器能够处理多达10,000-20,000个客户端,其中每个客户端始终通过一个线程与服务器进行双向通信基于命令的系统。服务器将接收命令,并根据命令执行单个(或多个)任务。我的问题是如何在各种情况下适本地使用.NET线程结构,执行可能需要一分钟到几小时的任务,具体取决于正在执行的工作。最让我困惑的是,无论我读到什么,我都会看到类似“使用手动创建的线程(或自定义线程池)来处理‘长时间运行’的任务,并使用TPL来处理短期任务,或需要并行处理的任务。”什么是长时间运行的任务?到底是什么?那是5秒、60秒还是

C# - 何时在高事件服务器中使用标准线程、ThreadPool 和 TPL

我最近阅读了很多关于线程的书籍,因为我正在寻求开发一个高性能、可扩展的TCP服务器,该服务器能够处理多达10,000-20,000个客户端,其中每个客户端始终通过一个线程与服务器进行双向通信基于命令的系统。服务器将接收命令,并根据命令执行单个(或多个)任务。我的问题是如何在各种情况下适本地使用.NET线程结构,执行可能需要一分钟到几小时的任务,具体取决于正在执行的工作。最让我困惑的是,无论我读到什么,我都会看到类似“使用手动创建的线程(或自定义线程池)来处理‘长时间运行’的任务,并使用TPL来处理短期任务,或需要并行处理的任务。”什么是长时间运行的任务?到底是什么?那是5秒、60秒还是

c# - 实现可重试 block 的正确完成

Teaser:伙计们,这个问题不是关于如何实现重试政策的。这是关于正确完成TPL数据流block。这个问题主要是我之前问题的延续RetrypolicywithinITargetBlock.这个问题的答案是@svick的智能解决方案,它利用了TransformBlock(来源)和TransformManyBlock(目标)。剩下的唯一问题就是如何以正确的方式完成这个block:先等待所有重试完成,然后再完成目标block。这是我最终得到的结果(这只是一个片段,不要过多关注非线程安全的retries集):varretries=newHashSet>();TransformManyBlock

c# - 实现可重试 block 的正确完成

Teaser:伙计们,这个问题不是关于如何实现重试政策的。这是关于正确完成TPL数据流block。这个问题主要是我之前问题的延续RetrypolicywithinITargetBlock.这个问题的答案是@svick的智能解决方案,它利用了TransformBlock(来源)和TransformManyBlock(目标)。剩下的唯一问题就是如何以正确的方式完成这个block:先等待所有重试完成,然后再完成目标block。这是我最终得到的结果(这只是一个片段,不要过多关注非线程安全的retries集):varretries=newHashSet>();TransformManyBlock

c# - C# 5.0 的异步等待功能与 TPL 有何不同?

我看不出C#(和VB)的新异步特性和.NET4.0的TaskParallelLibrary之间有什么不同.以EricLippert的代码fromhere为例:asyncvoidArchiveDocuments(Listurls){Taskarchive=null;for(inti=0;iawait关键字似乎有两个不同的用途。第一次出现(FetchAsync)似乎意味着,“如果此值稍后在方法中使用并且其任务未完成,请等到它完成后再使用继续。”第二个实例(archive)似乎意味着,“如果此任务尚未完成,请立即等待它完成。"如果我错了,请纠正我。这样写不就这么简单吗?voidArchive