1
Vývoj / Re:ZeroMQ - asynchronní klient
« kdy: 13. 10. 2020, 06:52:45 »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:Kód: [Vybrat]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.
Ahoj, možná jsem se vyjádřil špatně, ale neřeším stranu serveru (Task.WaitAll byl jen pro ukázku, vím že je blokující). Spíš mě zajímá klient. Chci přes jedem ZeroMQ soket multiplexovat komunikaci z několika vláken. Je to možné, lze pouít např zmíněný objekt proxy, ale ten je blokující a nemá metody jako IsRunning a podobně (metody pro kontrolu a ovládání běhu). Myslím si, že řešení bude objekt Poller, ale stále se mi ho nepodařilo rozběhat ke své spokojenosti. Řešením by samozřejmě mohlo bt spustit Proxy ve vedlejším vlákně, ale jak už jsem zmínil, pak se špatně hlídí jeho stav.
Je vůbec cesta jak to používat bez blokace hlavního vlákna? Chtěl bych použít NetMQ v gui aplikaci, ale tam samozřejmě nechci. aby mi zamrzlo hlavní vlákno při odesílání a přijímání zpráv.