2009-12-10 19 views
7

Quindi stavo chattando con un collega su fibers e ho trovato this paper from 2003 che descrive un'implementazione di coroutine in C# usando l'API Fibre.Fibre in C#: sono più veloci degli iteratori e le persone le hanno usate?

L'implementazione di Yield in questo documento era per .NET 1.1, quindi è precedente alla sintassi yield return visualizzata in .NET 2.0.

Sembra decisamente, a prima vista, che l'implementazione qui sia potenzialmente più veloce e possa scalare piuttosto bene su più CPU.

Qualcuno l'ha usato?

+2

Non l'ho usato, ma ho un interesse per l'argomento. Ecco una bella implementazione di coroutine in C# con un programmatore round-robin: http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf – jpbochi

+2

BTW, che tipo di risposta fare ti aspetti per questa domanda? – jpbochi

+0

Non l'ho usato, ma l'articolo era interessante. Il problema è che questo sembra essere stato ampiamente implementato ora, in Windows. –

risposta

7

Non l'ho usato, ma ho un interesse per l'argomento. Ecco una bella implementazione di coroutine in C# con un programmatore round robin: http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=71235c5a-3753-4bab-bdb0-334ab439afaf

A proposito, citando wikipedia, "le fibre descrivono essenzialmente lo stesso concetto delle coroutine". Per quanto ne so, la cosa più vicina a una coroutine (o una fibra) in C# sono iteratori. In realtà, sono notevolmente vicini alle coroutine. Lippert ha pubblicato diverse prese sugli iteratori. Speriamo che nessuno di essi rappresenti un problema serio per gli scopi di cui hai bisogno.

6

Ho usato "coroutine" a base di resa e devo dire che sono un dolore nel sedere. Il problema è, naturalmente, che ovunque tu voglia usarli, sei costretto a usare la sintassi del rendimento. Non solo, ma se non si concatenano i rendimenti (il genitore produce la resa del figlio), è possibile solo annidare le proprie coroutine a un livello profondo. Ciò distrugge completamente uno dei principali vantaggi delle coroutine (salvataggio/ripristino completo dello stack).

Ho implementato un sistema di coroutine basato su fibra in C# e ha funzionato meravigliosamente fino a quando non ho riscontrato un'eccezione. Sfortunatamente il runtime .Net memorizza un po 'di roba di eccezione interna nei thread del sistema operativo, il che significa che l'emulazione di più thread usando le fibre OS (e p/invoke) non funzionerà, a meno che tu non abbia mai e poi mai un'eccezione.

+0

Potresti aggirare la mancanza di gestione delle eccezioni nel codice non gestito, aggiungendo un try/catch attorno a ogni pezzo di codice gestito, prima del rendimento? – Contango

+1

Questa risposta è importante. Significa che non puoi mai usare coroutine in fibra nella produzione. – usr

+0

In realtà significa solo che è necessario nidificare l'esecuzione, supportare le eccezioni gestite e non gestite allo stesso modo in cui si esegue, propagando SOLO l'eccezione SOLO quando non gestite. I concetti di programmazione basati su eccezioni dovrebbero anche essere supportati attraverso un concetto di fibra o un derivato adatto. – Jay

1

coroutine, al primo sguardo cattura la mia attenzione .. qualche giorno fa ero alla ricerca di soluzione di workflow per Parrallel AsyncWCF chiamate di metodo e quello che ho trovato è stato davvero affascinante:

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

questo articolo mostra un ottimo utilizzo delle coroutine per creare/gestire i flussi di lavoro nell'applicazione Silverlight che consuma WCF utilizzando il modello asincrono.

Non conosco la sua velocità con gli iteratori ma per me è come una forma avanzata di subroutine che può essere molto utile in compiti mission critical in cui una subroutine normale non può offrirti il ​​lusso di eseguire un'attività in parallelo .

Problemi correlati