Sto creando una libreria che contiene una classe che espone diversi metodi Async:
public class MyClass {
public async Task<Foo> DoFooAsync() { /*...*/ }
public async Task<Bar> DoBarAsync() { /*...*/ }
}
Ho due (principali) domande a riguardo:
-
Capisco che non tutti amano (o hanno bisogno di) lavorare in modo asincrono; è facile per qualcuno che usa la mia libreria invocare questi metodi in modo sincrono. Tuttavia, non sarà molto importante fornire wrapper sincrono per il metodo asincrono in modo che la classe fornisca anche un metodo
public Foo DoFoo()
epublic Bar DoBar()
.- Devo fornire questi metodi o devo consentire alle persone di implementare i propri?
-
Se fornisco questi metodi, dovrei:
- Crea un metodo
private T ExecuteFunctionSynchronously<T>(Func<T> func)
e i metodi sincroni richiamano questoExecuteFunctionSynchronously
internamente o ... - ... ogni metodo sincrono dovrebbe chiamare il metodo async 'waterfall style' (quindi
DoFoo()
eseguereturn DoFooAsync().Result
(o qualcosa del genere) internamente?
- Crea un metodo
-
La classe avrà in seguito un "message loop" che legge continuamente dati provenienti da un socket (atteso). Voglio che questo ciclo di messaggi continui 'eternamente'. Voglio che la classe sia facilmente utilizzabile da tutti.
- Che tipo di 'stile' dovrei usare per questo messageloop per notificare agli utenti di MyClass che qualcosa è successo?
- Eventi (ad esempio
MyClass.FooReceived += myhandler
)? - Callback (ad esempio
MyClass.StartListening(myhandler)
)? - Qualcosa di "attendibile" (ad esempio
while (await MyClass.GetFoo()) { ... }
)? - Reattivo (Rx)?
- Qualcosa di diverso da sopra, cioè ...
- Eventi (ad esempio
- Che tipo di 'stile' dovrei usare per questo messageloop per notificare agli utenti di MyClass che qualcosa è successo?
In primo luogo sto chiedendo una guida sullo "stile"; come ti avvicineresti a questo e come pensi che una libreria (principalmente) asincrona dovrebbe fornire un'interazione (API savoise) mantenendo al tempo stesso internals e messageloops fuori dalla mente dell'utente senza esporre troppo di ciò che sta accadendo internamente.