2015-07-04 29 views
10

Dołączam do projektu C#, w którym programiści intensywnie używają Fibers. Przed tym projektem nawet o nich nie słyszałem i poprzednio używałem async await i Threads i BackgroundWorker do moich wielozadaniowych operacji. Dzisiaj pytałem ich, dlaczego używali Fiber s, a główny programista powiedział, że łatwiej mu będzie debugować. Oznacza to, że wie, z jakiego wątku pochodzi dana funkcja, a nawet czy ma dostęp do zmiennych wyższych w stosie.Fibres vs async czekają na

Zastanawiam się, jakie są zalety i wady korzystania z Fiber s vs przy użyciu nowego async await i przy użyciu Thread s.

PS: Używamy .Net 4.5

+2

Jaką implementację Fibre masz na myśli? [Windows Fibre API] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682661 (v = vs.85) .aspx)? – timmyl

+1

To prawda, że ​​po zatrzymaniu debuggera nie można zobaczyć, co robi aplikacja, ponieważ wszystkie wątki nie robią nic przez większość czasu. To duża wada asynchronicznego IO. Nigdy nie polecałbym jednak włókien. – usr

+1

Włókna są droższe niż zadania. Włókna wymagają 1MB pamięci na stos. Zadania wymagają pamięci dla zmiennych lokalnych, ale używają stosu programu planującego. –

Odpowiedz

14

Pytałem ich, dlaczego stosuje się włókna i główny deweloper powiedział że łatwiej go do debugowania. Co oznacza, że ​​wie, który wątek ma konkretną funkcję, a nawet może mieć większy dostęp do zmiennych w stosie.

To brzmi wprost osobliwie. Korzystając z biblioteki zadań równoległych z niestandardowymi harmonogramami innymi niż domyślne ThreadPoolTaskScheduler, możesz sam zdecydować, w jaki sposób zaplanowane są twoje zadania (i niekoniecznie jest to nowe wątki). async-await z drugiej strony zapewnia wygodny sposób wykonywania asynchronicznego IO. VS daje możliwość debugowania kodu asynchronicznego przy użyciu tak, jakby wykonywał synchronicznie.

Aby używać włókien, należałoby wywołać niezarządzane API, ponieważ .NET nie oferuje żadnych zarządzanych opakowań w BCL. Even the docs of fibers clearly say there isn't a clear advantage to using them:

Ogólnie włókna nie zapewniają korzyści w porównaniu z dobrze zaprojektowanym wielowątkowych aplikacji. Jednak użycie włókien może ułatwić aplikacje portowe, które zostały zaprojektowane do planowania własnych wątków.


Zastanawiałem się, jakie są zalety i wady stosowania Włókna vs użyciu nowego asynchronicznie czekają i korzystania wątki.

Korzystanie z async-await daje korzyści z wykonywania asynchronicznej pracy związanej z IO, podczas gdy czujesz się jakbyś wykonywał synchronicznie. Biblioteka zadań równoległych zapewnia łatwy sposób planowania pracy z dedykowanymi wątkami, czy to z wątków puli wątków czy nowych wątków, a jednocześnie umożliwia podpięcie się do mechanizmu, który planuje te jednostki pracy. Naprawdę nie widzę żadnej przewagi w korzystaniu z dzisiejszych włókien, z całą strukturą, która ma do zaoferowania.

Myślę, że powinieneś poinformować głównego programistę o przeczytaniu wielowątkowej i asynchronicznej pracy IO przy użyciu zadań biblioteki równoległej i odpowiednio async-await. Myślę, że ułatwiłoby to życie dla was wszystkich.

+1

Dzięki za wyjaśnienie. Bardzo to doceniam. Myślę, że jednym z największych problemów z włóknami jest brak obsługi .Net, o czym wspomniałeś. –

+3

+1 Jeszcze jedna uwaga: "wie, z jakiego wątku pochodzi dana funkcja, a może nawet ma dostęp do zmiennych wyższych w stosie." Rozumiem, że oznacza to, że włókna zachowują swój stos wywołań podczas wznawiania, podczas gdy metody asynchroniczne nie . Myślę, że ogólnie async/await/TPL są łatwiejsze do użycia i powodują, ale widzę argument debugowania stosu wywołań przeciwko nim. –

Powiązane problemy