2009-12-10 13 views
7

Więc rozmawiałem z kolegą o fibers i pojawił się this paper from 2003, który opisuje implementację współprogramów w języku C# przy użyciu interfejsu API Fibre.Włókna w języku C#: czy są szybsze niż iteratory i czy ludzie ich używają?

Implementacja Yield w tym dokumencie dotyczy .NET 1.1, więc poprzedza składnię yield return, która pojawiła się w .NET 2.0.

Zdecydowanie na pierwszy rzut oka wygląda na to, że implementacja jest potencjalnie szybsza i może być skalowalna na wiele procesorów.

Czy ktoś go użył?

+2

Nie użyłem tego, ale interesuję się tym tematem. Oto jedna dobra implementacja programu coute z programem planującym cyklicznego robaka: http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afafilm – jpbochi

+2

BTW, jakiego rodzaju odpowiedzi oczekujesz na to pytanie? – jpbochi

+0

Nie użyłem tego, ale artykuł był interesujący. Problem polega na tym, że wydaje się, że w dużym stopniu został już wdrożony w systemie Windows. –

Odpowiedz

7

Nie użyłem tego, ale jestem zainteresowany tematem. Oto jedna fajna implementacja Coroutines w C# z harmonogramem round-robin: http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf

Przy okazji, podając wikipedia, "włókna opisują zasadniczo tę samą koncepcję co coroutines". O ile mi wiadomo, najbliżej do coroutine (lub światłowodu) w C# są iteratory. W rzeczywistości są one niezwykle zbliżone do coroutines. Lippert zamieściłem kilka informacji o iteratorach. Mamy nadzieję, że żaden z nich nie stanowi poważnego problemu dla potrzeb, których potrzebujesz.

6

Użyłem "coroutines" opartych na plonach i muszę powiedzieć, że to ból w tyłku. Problem polega oczywiście na tym, że wszędzie, gdzie chcesz z nich korzystać, musisz użyć składni plonów. Nie tylko to, ale dopóki nie uzyskasz plonów (rodzic daje plony dziecka), możesz zagnieździć swoich coroutines tylko na jednym poziomie głębokości. To całkowicie niszczy jedną z kluczowych zalet programu Coroutines (zapisywanie/przywracanie pełnego stosu).

Zaimplementowałem oparty na światłowodzie układ współdziałający w języku C# i działał wspaniale DO ZATRZYMANIA wyjątku. Niestety środowisko wykonawcze .Net przechowuje wiele wewnętrznych wyjątków w wątkach systemu operacyjnego, co oznacza, że ​​emulacja wielu wątków za pomocą włókien OS (i p/invoke) po prostu nie zadziała, chyba że nigdy, przenigdy nie będziesz miał wyjątku.

+0

Czy mógłbyś poradzić sobie z brakiem obsługi wyjątków w kodzie niezarządzanym, dodając próbę/catch do każdego fragmentu zarządzanego kodu, przed zyskiem? – Contango

+1

Ta odpowiedź jest ważna. Oznacza to, że nigdy nie można używać produkowanych na bazie włókien korupin. – usr

+0

W rzeczywistości oznacza to, że podczas wykonywania musisz zagnieżdżać wykonywanie, obsługę obsługiwanych i nieobsługiwanych wyjątków, propagując wyjątek TYLKO całkowicie, gdy nie jest on obsługiwany. Koncepcje programowania oparte na wyjątkach powinny być również wspierane poprzez koncepcję Fiber lub odpowiednią pochodną. – Jay

1

współprogram, na pierwszy rzut oka przykuwa moją uwagę .. kilka dni temu szukałem rozwiązania workflow dla parrallel AsyncWCF Metoda nazywa i co znalazłem było naprawdę fascynujące:

http://csharperimage.jeremylikness.com/2010/03/sequential-asynchronous-workflows-in.html

ten artykuł pokazuje bardzo dobre wykorzystanie coroutines do tworzenia/zarządzania przepływami pracy w aplikacji Silverlight, która pochłania WCF przy użyciu Async Pattern.

Nie znam jego prędkości w stosunku do iteratorów, ale jest to dla mnie zaawansowana forma podprogramów, która może być bardzo pomocna w zadaniach krytycznych dla misji, gdy normalny podprogram nie może zaoferować luksusu wykonywania równolegle zadań. .

Powiązane problemy