2016-01-14 29 views
0

嗨,我有一个关于任务的简短问题。据我所知,任务本身可以启动多个线程。C#任务行为

比方说,我有两个硬件传感器,它们给我两个不同的数据端口上的数据。

我想在我的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。 这两个队列可以以不同的速度填充。因此,让我们说队列A有50个元素,但是SensorB速度更快,并且已经有100个元素存储在queueB中。不过,我需要以某种方式检索数据,以便我可以将queueA [33] .data和queueB [33] .data放置在queueC [33] .data中。当然,我不希望开始与element33,但总是与存储在queueA和等级队列B的第一要素....

我希望你明白我的中东和北非

回答

1

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

0

从你的问题来看,你应该阅读一下关于C#中任务和异步的工作方式,该主题太大而无法回答堆栈溢出问题。我会建议拿起一本书,因为MS。当涉及到提供坚实的知识块时,文档是垃圾。

简而言之,任务不能在自身内部启动多个线程。从概念上讲,任务比线程小。一个线程可以处理多个任务,因此可以说你有20个任务,c#运行时将有一个线程池,例如4个线程,他们将分别执行一个任务,处理它,然后继续下一个任务任务等等。

也许你指的是Asyncronous操作。这是一个非常不同的野兽,而不是一个线程。基本上,你要求计算机的某个部分关闭,做一些独立的工作,例如通过网络发送数据,并在完成时通知你的程序,而不会同时阻塞线程。

避免使用Task.Factory,因为它有很多方法可以在脚下自己拍摄。 Take a look at Stephen Cleary blog。大多数情况下,Task.Run(...是更好的选择。

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

或者我应该在同一任务中实现它们,因为C#会自动把它们放在不同的线程?

您指的是异步操作。

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