2013-08-05 16 views
5

Czy zadanie C# działa na jednym rdzeniu?Czy zadanie C# działa na jednym rdzeniu?

Mam projekt, w którym muszę zdecydować, ile zadań należy utworzyć. Potrzebuję utworzyć tyle, ile komputer może pobrać. Czy to liczba procesorów, rdzeni lub procesorów logicznych, jestem zdezorientowana między trzema opcjami.

+0

Jak rozumiem, zarządzany wątek nie jest koniecznie uruchamiany na własnym natywnym wątku. Myślę więc, że odpowiedź na twoje pytanie brzmi "nie". – ken

+1

Zadanie działa bardzo podobnie do wątku, dla którego rdzeń działa (wierzę). Aby odpowiedzieć na twoje pytania, zależy to od tego, jakie zadania wykonujesz, które zasoby wykorzystują najwięcej procesora/IO/Memory/Disk ...? – TheKingDave

+0

Zadanie może przeskakiwać z jednego rdzenia na drugi. Naprawdę powinieneś zapytać: "czy zadanie działa na więcej niż jednym rdzeniu?". –

Odpowiedz

3

Zadanie wykonuje się na wątku. System operacyjny planuje wątki dla rdzeni. Rdzenie są logiczną koncepcją i różnią się od fizycznych procesorów.

Tworzenie Environment.ProcessorCount zadań, lub lepiej użyć jednego z konstruktów TPL na wyższym poziomie, takich jak PLINQ lub Parallel.

0

Jeśli korzystasz z biblioteki zadań (PTL), nie musisz się o to martwić. Możesz przeczytać więcej na ten temat here. W skrócie:

TPL dynamicznie skaluje stopień współbieżności, aby jak najefektywniej wykorzystać wszystkie dostępne procesory. Ponadto OC obsługuje podział prac ...

Utworzyliśmy otoki wokół zadania w następujący sposób:

public static class PeriodicTaskFactory 
{ 
    public static Task Start(Action action, int intervalInMilliseconds = -1, int delayInMilliseconds = 0, int duration = -1, int maxIterations = -1, bool synchronous = false, CancellationToken cancelToken = null, TaskCreationOptions periodicTaskCreationOptions = TaskCreationOptions.None); 
} 

I wtedy nazywamy go jak tak. W tym przypadku jedyną pracą, którą chcemy wykonać, jest wywołanie pojedynczej metody co 1 minutę, z 1 sekundowym opóźnieniem w pierwszym wykonaniu.

 PeriodicTaskFactory.Start(() => 
     { 
      CdClMappingLogic.Invoke(); 
     }, 60000, 1000, -1, -1, true) 
+0

Czy możesz być bardziej konkretny, proszę? Tak, faktycznie czytam ten dokument. – user2381422

+0

Zasadniczo to, co on tu oszczędza, to to, że w TPL definiujesz pracę i pozwalasz ramom wypracować ile wątków ... itd. Do stworzenia. Po prostu definiujesz, co każdy wątek ma robić. – TheKingDave

+0

@ user2381422 - Tak, jak powiedział TheKingDave, jest bardzo prosty w użyciu. Zdefiniujesz, co chcesz wykonać, zawiniesz w zadaniu, a .NET FW zdecyduje, jak najlepiej wykonać ten blok na podstawie danych procesora i innych zasobów. –

Powiązane problemy