Отмена TcpClient.BeginConnect

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Arum
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 09.08.2011 (Вт) 0:50
Откуда: Питер

Отмена TcpClient.BeginConnect

Сообщение Arum » 10.09.2012 (Пн) 7:20

Доброго дня господа.
Нужен совет знающих людей, как грамотно отменить асинхронный запрос у TcpClient инициализированный методом BeginConnect?
tcpClient.Close не помогает.
Если делать через сокет, tcpClient.Client.CancelConnectAsync(e), то непонятно, откуда взять SocketAsyncEventArgs
Т.к. при инициализации коннекта он, вроде как и не участвует:
tcpClient.BeginConnect(IP, Port, New AsyncCallback(AddressOf DoConnect), Nothing)

vb.net 2010 .NET Framework 4.0

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Отмена TcpClient.BeginConnect

Сообщение FireFenix » 10.09.2012 (Пн) 9:45

http://msdn.microsoft.com/en-us/library/tad07yt6
msdn писал(а):Your callback method should invoke the EndConnect method. When your application calls BeginConnect, the system will use a separate thread to execute the specified callback method, and will block on EndConnect until the Socket connects successfully or throws an exception. If you want the original thread to block after you call the BeginConnect method, use WaitOne. Call the Set method on a ManualResetEvent in the callback method when you want the original thread to continue executing. For additional information on writing callback methods see Callback Sample.

http://msdn.microsoft.com/en-us/library ... endconnect
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Arum
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 09.08.2011 (Вт) 0:50
Откуда: Питер

Re: Отмена TcpClient.BeginConnect

Сообщение Arum » 10.09.2012 (Пн) 12:18

Благодарствую за ответ, но, немного не то.

Установка подключения, передача данных, закрытие сокета, это все отлично работает.
.EndConnect тоже использую, но проблема как раз в том, что бы установку подключения разорвать досрочно и выполнение не дошло до функции DoConnect
Вот этого как раз никак не получается и выполнение в любом случае у меня попадает в DoConnect

...
res = tcpClient.BeginConnect(IP, Port, New AsyncCallback(AddressOf DoConnect), Nothing)
...

Private Sub DoConnect(ByVal AR As IAsyncResult)
tcpClient.EndConnect(AR)
...
End Sub

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Отмена TcpClient.BeginConnect

Сообщение FireFenix » 10.09.2012 (Пн) 22:41

Как оно может не дойти, если при вызове
Код: Выделить всё
res = tcpClient.BeginConnect(IP, Port, New AsyncCallback(AddressOf DoConnect), Nothing)

создаётся новый поток и передаётся управление DoConnect
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

Arum
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 09.08.2011 (Вт) 0:50
Откуда: Питер

Re: Отмена TcpClient.BeginConnect

Сообщение Arum » 11.09.2012 (Вт) 6:36

Да, спасибо, понятно.
Просто от вызова BeginConnect и до входа в функцию DoConnect может пройти секунд сорок (например, при коннекте через прокси-сервера).
Я и подумал, что можно сделать таймаут на коннект:
Код: Выделить всё
Dim result As IAsyncResult = tcpClient.BeginConnect(IP, Port, New AsyncCallback(AddressOf DoConnect), Nothing)
Dim success As Boolean = result.AsyncWaitHandle.WaitOne(lTimeOut, True)
If Not success Then
'//_TimeOut
'//тут убить коннект, сам поток, освободить ресурсы и выйти
End If

Вот и застопорился, что написать в блок _TimeOut, т.к. полностью остановить коннект не получается, а следовательно, тут же освобождать ресурсы не удается.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 11.09.2012 (Вт) 7:42

Свойство ReceiveTimeout пробовал использовать?

Arum
Начинающий
Начинающий
 
Сообщения: 10
Зарегистрирован: 09.08.2011 (Вт) 0:50
Откуда: Питер

Re: Отмена TcpClient.BeginConnect

Сообщение Arum » 11.09.2012 (Вт) 9:57

Qwertiy писал(а):Свойство ReceiveTimeout пробовал использовать?

Да ReceiveTimeout и, даже на всякий случай SendTimeout пробовал. Коннект при плохом соединении висит секунд 40, хотя ReceiveTimeout выставлено на 1000 (для теста)
Потому и заморочился с таймаутом именно на коннект.


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

    TopList