簡體   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