Diskuze: Návrh Async TCP serveru s využitím async/await
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Tak začneme třeba serverem.
Metoda ServerStart je sice async, ale nevrací Task. Takže nemůžeme ji
zavolat s await.
Když teda spustím takový server, tak program hned skončí s výpisem
"konec";
static async Task Main(string[] args)
{
var server = new Server("127.0.0.1");
server.ServerStart();
Console.WriteLine("konec");
}
Chápeš proč? Jestli mi řekneš, že tobě to nedělá, tak končím
Neni mozny, ze ma async Main a awaituje volani ServerStart() ?
Ja jsem kvuli tomu nainstaloval mono na linux a sice mam podporu jen C# 7, takze
async Main nevyzkousim, ale potvrzuju to co rikas. Program se ukonci.
Asi by potreboval poradne procist teorii async/await.
Já spíš tipuju, že má wpf aplikaci a server spouští v události na
klik tlačítka. Takže si toho ani nevšimne.
EDIT: await nemuzes pouzit na metodu async void
Asi se celou dobu nechápeme co vlastně chci, vždyť tohle je ale přesně to co potřebuju, co by měl vracet nějaký asynchroní start serveru? já ho potřebuji jen odstartovat. pak jen ve smyčce připojovat klienty vevnitř.
Já mám pocit, že celou dobu základní teorii async/await chápu. Jen se nechápeme co očekávám od konkrétní implementace.
Jinak je to jen console app.
Obsah mainu je prakticky nepodstatný, obsluhuju v něm psaním commandů aplikační databázi.
Pro informaci Main je prakticky takovýdle:
private static void Main(string[] args)
{
Server server = new Server("192.168.1.101");
server.ServerStart();
for (string command = Console.ReadLine(); command != "EXIT"; command = Console.ReadLine())
{
// všemožné commandy
}
}
Nojo, jenze tobe pri zivote ten server drzi ta smycka. To je vono .
Tak já teda nevím, co vlastně chceš. Async/await nechceš řešit, nebudu
to už řešit. Tvoje použití bude fungovat, ale je to dost nestandardní.
Tak třeba další tip: rozdělit server a psaní příkazů do 2 vláken
(server do nového vlákna, příkazy nechat v původním).
Pak se běžně dělá, že server naslouchá v odděleném vlákně a klienti
se obsluhují v dalším vlákně. Případně se použije jedno vlákno na
jednoho klienta. Tam už záleží na povaze aplikace.
Takže to už máme 3 vlákna: příkazy, server (accept), server (klienti)
Zobrazeno 7 zpráv z 7.