Thread View: alt.pl.comp.lang.csharp
6 messages
6 total messages
Started by yamma
Sat, 08 Jan 2011 14:17
TcpListener, jak zatrzymać
Author: yamma
Date: Sat, 08 Jan 2011 14:17
Date: Sat, 08 Jan 2011 14:17
9 lines
1452 bytes
1452 bytes
Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi w osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia, tworzy nowe sockety, itd. Problem pojawia się gdy chcę zakończyć pracę tego TcpListenera. Jak to zrobić? Z poziomu jego wątku nie mogę tego zrobić bo blokuje tenże wątek na metodzie AcceptTcpClient, natomiast jeśli próbuję wywołać metodę Stop z innego wątku to aplikacja się wywala z błędem "Operacja blokująca została przerwana przez wywołanie funkcji WSACancelBlockingCall". yamma
Re: TcpListener, jak zatrzymać
Author: 3P
Date: Sat, 08 Jan 2011 18:38
Date: Sat, 08 Jan 2011 18:38
21 lines
2014 bytes
2014 bytes
Dnia 08-01-2011 o 15:17:05 yamma <yamma@wp.pl> napisał(a): > Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam > TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi w > osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia, tworzy > nowe sockety, itd. Problem pojawia się gdy chcę zakończyć pracę tego > TcpListenera. Jak to zrobić? Z poziomu jego wątku nie mogę tego zrobić > bo blokuje tenże wątek na metodzie AcceptTcpClient, natomiast jeśli > próbuję wywołać metodę Stop z innego wątku to aplikacja się wywala z > błędem "Operacja blokująca została przerwana przez wywołanie funkcji > WSACancelBlockingCall". > yamma Nigdy sam z tego nie korzystałem, ale czy pierwsze dwa linki z google'a ci nie pomogą? http://stackoverflow.com/questions/365370/proper-way-to-stop-tcplistener http://stackoverflow.com/questions/31871/wsacancelblockingcall-exception -- 3P
Re: TcpListener, jak zatrzymać
Author: yamma
Date: Sat, 08 Jan 2011 23:01
Date: Sat, 08 Jan 2011 23:01
29 lines
2519 bytes
2519 bytes
3P wrote: > Dnia 08-01-2011 o 15:17:05 yamma <yamma@wp.pl> napisał(a): > >> Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam >> TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi >> w osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia, >> tworzy nowe sockety, itd. Problem pojawia się gdy chcę zakończyć >> pracę tego TcpListenera. Jak to zrobić? Z poziomu jego wątku nie >> mogę tego zrobić bo blokuje tenże wątek na metodzie AcceptTcpClient, >> natomiast jeśli próbuję wywołać metodę Stop z innego wątku to >> aplikacja się wywala z błędem "Operacja blokująca została przerwana >> przez wywołanie funkcji WSACancelBlockingCall". >> yamma > > Nigdy sam z tego nie korzystałem, ale czy pierwsze dwa linki z > google'a ci nie pomogą? > > http://stackoverflow.com/questions/365370/proper-way-to-stop-tcplistener > http://stackoverflow.com/questions/31871/wsacancelblockingcall-exception Tak, czytałem to. Po mojemu, metoda AcceptTcpClient powinna uzyskać status deprecated bo jedynym sposobem zamknięcia jest zabicie wątku. A 5 przykazanie mówi wyraźnie "Nie zabijaj". :-) Jedyne rozwiązanie to BeginAcceptTcpClient z callbackiem. Generalnie z socketami w .NET jest niezła jazda. Np. próba połaczenia się z nieistniejącym adresem/portem powoduje wywalenie wyjątku co jest dla mnie kompletnie niezrozumiałe bo to nie jest żadne wyjątkowe zachowanie. Konieczność obsługi takiego wyjątku kompletnie rozpieprza całą koncepcję i logikę aplikacji. yamma
Re: TcpListener, jak zatrzymać
Author: Teodor
Date: Mon, 10 Jan 2011 10:21
Date: Mon, 10 Jan 2011 10:21
44 lines
2810 bytes
2810 bytes
Użytkownik "yamma" <yamma@wp.pl> napisał w wiadomości
news:igaqct$7eq$1@inews.gazeta.pl...
> 3P wrote:
>> Dnia 08-01-2011 o 15:17:05 yamma <yamma@wp.pl> napisał(a):
>>
>>> Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam
>>> TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi
>>> w osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia,
>>> tworzy nowe sockety, itd. Problem pojawia się gdy chcę zakończyć
>>> pracę tego TcpListenera. Jak to zrobić? Z poziomu jego wątku nie
>>> mogę tego zrobić bo blokuje tenże wątek na metodzie AcceptTcpClient,
>>> natomiast jeśli próbuję wywołać metodę Stop z innego wątku to
>>> aplikacja się wywala z błędem "Operacja blokująca została przerwana
>>> przez wywołanie funkcji WSACancelBlockingCall".
>>> yamma
>>
>> Nigdy sam z tego nie korzystałem, ale czy pierwsze dwa linki z
>> google'a ci nie pomogą?
>>
>> http://stackoverflow.com/questions/365370/proper-way-to-stop-tcplistener
>> http://stackoverflow.com/questions/31871/wsacancelblockingcall-exception
>
> Tak, czytałem to. Po mojemu, metoda AcceptTcpClient powinna uzyskać status
> deprecated bo jedynym sposobem zamknięcia jest zabicie wątku. A 5
> przykazanie mówi wyraźnie "Nie zabijaj". :-) Jedyne rozwiązanie to
> BeginAcceptTcpClient z callbackiem. Generalnie z socketami w .NET jest
> niezła jazda. Np. próba połaczenia się z nieistniejącym adresem/portem
> powoduje wywalenie wyjątku co jest dla mnie kompletnie niezrozumiałe bo to
> nie jest żadne wyjątkowe zachowanie. Konieczność obsługi takiego wyjątku
> kompletnie rozpieprza całą koncepcję i logikę aplikacji.
> yamma
Wywala wątek nawet wtedy gdy masz
try
{
}
catch (Exception ex)
{
}
?
----
ts
Re: TcpListener, jak zatrzymać
Author: yamma
Date: Mon, 10 Jan 2011 12:12
Date: Mon, 10 Jan 2011 12:12
26 lines
1903 bytes
1903 bytes
Teodor wrote:
> Użytkownik "yamma" <yamma@wp.pl> napisał w wiadomości
> news:igaqct$7eq$1@inews.gazeta.pl...
>> Tak, czytałem to. Po mojemu, metoda AcceptTcpClient powinna uzyskać
>> status deprecated bo jedynym sposobem zamknięcia jest zabicie wątku.
>> A 5 przykazanie mówi wyraźnie "Nie zabijaj". :-) Jedyne rozwiązanie
>> to BeginAcceptTcpClient z callbackiem. Generalnie z socketami w .NET
>> jest niezła jazda. Np. próba połaczenia się z nieistniejącym
>> adresem/portem powoduje wywalenie wyjątku co jest dla mnie
>> kompletnie niezrozumiałe bo to nie jest żadne wyjątkowe zachowanie.
>> Konieczność obsługi takiego wyjątku kompletnie rozpieprza całą
>> koncepcję i logikę aplikacji. yamma
>
> Wywala wątek nawet wtedy gdy masz
> try
> {
> }
> catch (Exception ex)
> {
> }
>
> ?
Dziwne pytanie. A jak myślisz, po co jest blok try - catch?
yamma
Re: TcpListener, jak zatrzymać
Author: yamma
Date: Mon, 10 Jan 2011 13:18
Date: Mon, 10 Jan 2011 13:18
26 lines
2555 bytes
2555 bytes
yamma wrote: > Męczę się już z tym parę dni i nawet guglanie nie pomaga. Mam > TcpListenera, który nasłuchuje na jakimś tam porcie. On sobie chodzi > w osobnym wątku. Wszystko pięknie bangla, odpowiada na połączenia, > tworzy nowe sockety, itd. Problem pojawia się gdy chcę zakończyć > pracę tego TcpListenera. Jak to zrobić? Z poziomu jego wątku nie mogę > tego zrobić bo blokuje tenże wątek na metodzie AcceptTcpClient, > natomiast jeśli próbuję wywołać metodę Stop z innego wątku to > aplikacja się wywala z błędem "Operacja blokująca została przerwana > przez wywołanie funkcji WSACancelBlockingCall". Ok. Po dłuższym śledztwie wykoncypowałem dwa rozwiązania. Przede wszystkim, przyczyną takiego zachowania jest próba zamknięcia z innego wątku niż ten, w którym chodzi TcpListener. Jak łatwo się domyślić, tradycyjnie, przykłady z dokumentacji MSDN dotyczące TcpListenera można o kant dupy potłuc. W sieci jest mnóstwo pytań o to. Ludzie spod znaku MVP, którzy wypowiadają się chętnie w innych tematach, w tym akurat raczej milczą i jeśli ktoś się chce czegoś dowiedzieć w tym temacie to raczej się nie dowie. Pierwsze rozwiązanie, to wywołanie metody Stop() i ordynarne przechwycenie wyjątku. Choć to rozwiązanie dla mnie jest ryzykowne, bo gość, który je podał nie miał żadnego TTSa przy nazwisku. Drugie rozwiązanie, to zwykłe otwarcie nowego połączenia z TcpListenerem z poziomu wątku głownego co spowoduje wyjście z metody AcceptTcpClient() a o to nam chodzi. yamma PS. TTS - Tajemniczy Trzyliterowy Skrót
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads