繁体   English   中英

C#任务行为

[英]C# Task behaviour

嗨,我对任务有一个简短的问题。 据我了解,任务本身可以启动多个线程。

可以说我有两个硬件传感器,它们通过两个不同的数据端口为我提供数据。

我想在我的C#项目中将它们实现为生产者,然后对数据进行处理。 在两个不同的任务中开始数据收集是否有意义? 还是我应该在同一任务中实现它们,因为C#会自动将它们放在不同的线程上?

 var producerWorker = Task.Factory.StartNew(() => SensorB(number));
            var producerWorker2 = Task.Factory.StartNew(() => SensorA(number));

要么

var producerWorker = Task.Factory.StartNew(() => Sensor_A_AND_B(number));

我的第二个问题是:当我在两个不同的任务中有两个不同的生产者时,如果它们的数据类型不同但需要在队列中的相同位置,如何将它们的数据添加到同一BlockingCollection队列中?

例如,如果我有SensorA的queueA,SensorB的queueB和queueC。 两个队列可以以不同的速度填充。 因此,可以说queueA有50个元素,但是SensorB快得多,并且已经在队列B中存储了100个元素。 但是,我需要以某种方式检索数据,以便可以将queueA [33] .data和queueB [33] .data放入queueC [33] .data中。 当然,我不想从element33开始,但总是从存储在queueA和queueB中的第一个元素开始。

我希望你能得到我的精神

任务以运行时认为最佳的方式执行。 通常,有一个线程池,两个任务都在可用线程上运行。 如果确实需要并行轮询两个传感器,则建议您使用两个真实线程来轮询并使用Reactive Extensions同步处理读数。

从您的问题来看,您应该阅读一些有关C#中的任务和异步工作方式的信息,该主题太大,无法在堆栈溢出时回答。 我建议读一本书,因为MS。 在提供扎实的知识方面,文档是垃圾。

Brifly,任务无法在其内部启动多个线程。 从概念上讲,任务是比线程小的单元。 一个线程可以处理多个任务,所以假设您有20个任务,c#运行时将有一个线程池,例如4个线程,它们将分别处理一个任务,然后处理并继续执行下一个任务。任务等等。

也许您指的是异步操作。 那是与线程完全不同的野兽。 基本上,您是在要求计算机的某些部分关闭,执行独立的工作,例如,通过网络发送数据并在程序完成时通知程序,而同时不会阻塞线程。

避免使用Task.Factory ,因为它有很多方法可以使自己陷入Task.Factory 看看Stephen Cleary博客 大多数情况下, Task.Run(...是一个更好的选择。

我最好的猜测是,当您说:

还是我应该在同一任务中实现它们,因为C#会自动将它们放在不同的线程上?

您指的是异步操作。

为简单起见,您可以创建两个单独的任务,并且一旦它们接收到数据,就会将其放入队列。 您的问题表明您需要同步传入的数据,如果是这样,阻塞队列可能是错误的选择。 请改用并发队列。 一个不同的任务可以读取QueueA [x]和QueueB [x],并缓冲传入的数据。 然后,当A和B都提供第N个结果时,可以弹出QueueC。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM