Piszę serwer TCP w C# i używam metod BeginXXX i EndXXX do komunikacji asynchronicznej. Jeśli dobrze rozumiem, kiedy użyję BeginXXX, żądanie będzie obsługiwane w puli wątków (gdy żądanie jest gotowe), podczas gdy wątek główny będzie nadal akceptował nowe połączenia.

Pytanie brzmi, co się stanie, jeśli wykonam akcję blokującą w jednym z tych AsyncCallbacks? Czy lepiej będzie uruchomić operację blokowania jako zadanie? Zadania również korzystają z puli wątków, prawda?

Obudowa użycia jest następująca:

Główny wątek konfiguruje gniazdo nasłuchiwania, które akceptuje połączenia przy użyciu BeginAccept i rozpoczyna nasłuchiwanie tych połączeń przy użyciu BeginReceive. Po odebraniu pełnej wiadomości wywoływana jest funkcja w zależności od tego, jaki był ten komunikat, w 80% przypadków funkcje te rozpoczną zapytanie/wstawienie/aktualizację do bazy danych.

c#
1
Robin Heggelund Hansen 1 październik 2012, 00:09

2 odpowiedzi

Najlepsza odpowiedź

Pytanie brzmi, co się stanie, jeśli wykonam akcję blokującą w jednym z tych AsyncCallbacks? Czy lepiej będzie uruchomić operację blokowania jako zadanie?

Jeśli robisz to zbyt często lub zbyt długo, pula wątków będzie się powiększać. Możliwe do momentu, w którym spowoduje awarię Twojej aplikacji.

Staraj się więc unikać blokowania tak bardzo, jak to możliwe. Ale odrobina tego powinna być do przyjęcia. Należy pamiętać, że ThreadPool będzie rósł o 1 nowy wątek na 500 ms. Upewnij się więc i zweryfikuj, że wyrównuje się w rozsądnej liczbie wątków.

Tępym narzędziem może być ograniczenie MaxThreads puli.

Zadania również korzystają z puli wątków, prawda?

Tak, więc Twoje możliwości są ograniczone.

1
Henk Holterman 1 październik 2012, 00:19

Proponuję użyć SocketAsyncEventArgs, który został wprowadzony w .net 4.5

Oto kilka materiałów do czytania, od których możesz zacząć

Kliknij

2
Larry 1 październik 2012, 00:47