Abbiamo un multitasking ad alte prestazioni, vicino all'applicazione C# in tempo reale. Questa performance è stata ottenuta principalmente implementando il multitasking cooperativo internamente con uno scheduler nazionale. Questo è spesso chiamato micro-thread. In questo sistema tutte le attività comunicano con altre attività tramite le code.C# continuazione di prima classe tramite l'interoperabilità C++ o in un altro modo?
Il problema specifico che abbiamo sembra essere risolvibile solo tramite continuazioni di prima classe che C# non supporta.
In particolare, il problema si pone in 2 casi relativi alle code. Ogni volta che una determinata attività esegue del lavoro prima di posizionare un oggetto su una coda. Cosa succede se la coda è piena?
Al contrario, un'attività diversa può richiedere un po 'di lavoro e quindi è necessario rimuovere un elemento da una coda. Cosa succede se quella coda è vuota?
Abbiamo risolto questo problema nel 90% dei casi collegando le code alle attività per evitare che le attività vengano richiamate se una delle loro code in uscita è piena o la coda in ingresso è vuota.
Inoltre alcune attività sono state convertite in macchine a stati in modo che possano gestire se una coda è piena/vuota e continuare senza attendere.
Il vero problema si pone in alcuni casi limite in cui non è pratico fare una di queste soluzioni. L'idea in questo scenario sarebbe quella di salvare lo stato di stack nel punto e passare a un'attività diversa in modo che possa eseguire il lavoro e successivamente riprovare l'attività di attesa ogni volta che è in grado di continuare.
In passato, abbiamo tentato di richiamare l'attività in attesa nella pianificazione (in modo ricorsivo) per consentire alle altre attività di riprendere in seguito l'attività in attesa. Tuttavia, ciò ha portato a troppe situazioni di "stallo".
C'è stato un esempio da qualche parte di un host CLR personalizzato per fare in modo che i thread .NET funzionino come "fibre" che essenzialmente consente di cambiare lo stato di stack tra i thread. Ma ora non riesco a trovare alcun codice di esempio per questo. Inoltre sembra che ci vorrà una certa complessità per farlo bene.
Qualcuno ha altre idee creative su come passare tra le attività in modo efficiente ed evitare i problemi di cui sopra?
Ci sono altri host CLR che offrono questo, commerciale o altro? C'è qualche libreria nativa aggiuntiva che può offrire qualche forma di continuazione per C#?
Esempio di host CLR in modalità fibra: potresti riferirti alle serie di blog di Dino Viehland su questo argomento, che iniziano qui: http://blogs.msdn.com/b/dinoviehland/archive/2004/08/16/215140. aspx – bobbymcr
Nit: un deadlock non è un problema di efficienza. È un problema di correttezza. (Inoltre, qual è la differenza tra una coda non legata e non più memoria? Stato è stato e deve essere memorizzato da qualche parte.) –
Stiamo aggiungendo una forma di continuazione a C# 5. Anche se non sono esattamente chiamate di prima classe/continuazioni in stile cc, sono moralmente equivalenti. Controlla il "CTP asincrono" per una versione di anteprima di esso. http://msdn.microsoft.com/en-us/vstudio/gg316360.aspx. Vedi anche il recente articolo di MSDN Magazine di Stephen Toub sulle caratteristiche delle prestazioni della funzione asincrona. –