2016-01-14 30 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。