2015-07-04 12 views
10

Mi unisco a un progetto C# in cui gli sviluppatori utilizzano pesantemente Fibers. Prima di questo progetto non ho nemmeno sentito parlare di loro e precedentemente usato async await e Threads e BackgroundWorker s alle mie operazioni di multitasking. Oggi stavo chiedendo loro perché hanno usato Fiber s e lo sviluppatore principale ha detto che è più facile per lui eseguire il debug. Significa che sa da quale thread proviene una particolare funzione e potrebbe persino accedere alle variabili più in alto nella pila.Fibre vs async attendono

Mi chiedevo quali sono i vantaggi e gli svantaggi dell'utilizzo di Fiber s vs utilizzando il nuovo async await e utilizzando Thread s.

PS: Stiamo utilizzando .Net 4,5

+2

Quale implementazione di fibra si riferisce all'uso di? La [Windows Fiber API] (https://msdn.microsoft.com/en-us/library/windows/desktop/ms682661 (v = vs.85) .aspx)? – timmyl

+1

È vero che quando si mette in pausa il debugger non è possibile vedere cosa fa l'app perché tutti i thread non fanno nulla la maggior parte del tempo. Questo è un grande svantaggio di IO asincrono. Non consiglierei mai le fibre, però. – usr

+1

Le fibre sono più costose delle attività. Le fibre richiedono 1 MB di memoria per lo stack. Le attività richiedono memoria per le variabili locali, ma usano lo stack dello scheduler. –

risposta

14

mi è stato chiesto loro perché hanno usato fibre e lo sviluppatore principale ha detto che è più facile per lui per eseguire il debug. Significa che sa da quale thread proviene una particolare funzione e potrebbe persino accedere alle variabili più in alto nello stack.

Sembra strano. Quando si utilizza la Libreria parallela attività con gli scheduler personalizzati diversi dal valore predefinito ThreadPoolTaskScheduler, è possibile decidere autonomamente come pianificare le attività (e non necessariamente su nuovi thread). async-await d'altra parte fornisce un modo conveniente di fare IO asincrono. VS offre la possibilità di eseguire il debug del codice asincrono utilizzando come se fosse in esecuzione in modo sincrono.

Per utilizzare le fibre, è necessario richiamare API non gestite, poiché .NET non offre alcun wrapper gestito nel BCL. Even the docs of fibers clearly say there isn't a clear advantage to using them:

In generale, fibre non forniscono vantaggi rispetto ad un ben progettato applicazione multithread. Tuttavia, l'utilizzo delle fibre può semplificare le applicazioni di porta progettate per pianificare i propri thread.


mi chiedevo quali sono i vantaggi e gli svantaggi di usare fibre vs utilizzando il nuovo async attendere e l'utilizzo di discussioni.

L'utilizzo di async-await offre il vantaggio di eseguire il lavoro asincrono legato all'IO mentre si sente come se si eseguisse in modo sincrono. La Libreria parallela attività fornisce un modo semplice di pianificare il lavoro su thread dedicati, siano essi thread di thread-pool o nuovi thread, consentendo al contempo di agganciare il meccanismo che pianifica le unità di lavoro. Oggi non vedo alcun vantaggio nell'utilizzare le fibre, con tutto ciò che la struttura ha da offrire.

Penso che dovresti dire al tuo principale sviluppatore di fare un po 'di lettura sul lavoro IO multi-threaded e asincrono usando la Libreria parallela Task e async-await, rispettivamente. Penso che renderebbe la vita più facile per tutti voi.

+1

Grazie per la spiegazione dettagliata. Lo apprezzo molto. Penso che uno dei maggiori problemi con le fibre sia la mancanza di supporto .Net come hai detto. –

+3

+1 Una nota aggiuntiva: 'sa da quale thread proviene una particolare funzione e potrebbe persino accedere alle variabili più in alto nello stack. - Interpreto questo per indicare che le fibre preservano il loro stack di chiamate quando riprendono, mentre i metodi asincroni non lo fanno . Penso che async/await/TPL in generale siano più facili da usare e ragionevoli, ma posso vedere l'argomento di debugging stack delle chiamate contro di loro. –