Nevim, jestli jsem problem uplne pochopil a taky nevim, jestli tu nemichate dve veci: 1) asynchronni zpracovani tasku na server 2) zpracovani vice tasku najednou (paralelne).
Nicmene i tak se to da resit ruzne:
Task.WaitAll je mimochodem blokujici, nevim jestli je to jen pro ukazku, ale tim si nepomuzete. Proste nastartujte Task.Run, jako to mate ve Vasi ukazce. Tim si regulujte, kolik paralelnich tasku chcete na serveru zpracovavat. V nich muzete v cyklu napriklad pres CancellationToken kontrolovat, zda se nemaji ukoncit (napriklad pri vypnuti serveru).
Uvnitr techto tasku muzete pouzivate async await jak je uvedeno v dokumentaci.
Kod jsem nijak netestoval, ale obecne s frontou by to mohlo pracovat treba takto:
var cts = new CancellationTokenSource();
Task.Run(async () => {
while (!cts.IsCancellationRequested) {
try {
var (message, more) = await client.ReceiveFrameStringAsync();
//process message
}
finally {
//nejaky delay pred kontrolou dalsi zpravy?
Task.Delay(TimeSpan.FromMilliseconds(100));
}
}
});
Predpokladam, ze z jedne instance 'client' muze cist vice vlaken. Takze tech Task.Run muzete nastartovat vice a token idealne predava i do te metody ReceiveFrameStringAsync, pokud to podporuje.