Прерывание Socket.Accept().
От: America  
Дата: 23.11.10 07:39
Оценка:
Запускаю в отдельном потоке прослушивание порта Socket.Accept. Нужно чтоб пользователь мог отменить прослушку, пробовал делать так:

thrd.Abort() — на это поток никак не откликается, исключение ThreadAbortException в потоке не возникает, если сделать thrd.Join() к вызывающему потоку, то из метода возвращение не происходит(поток зависает).

Пробовал Socket.Close() и Socket.ShutDown() возникают исключения, но даже ели их отлавливать всёравно проваливаются в метод Main с исключением TargetInvocationException().

В гугле по этому поводу других предложений нет. Можно ли как-нибудь снфть блокировку с потока, вызывающего Socket.Accept()?
Re: Прерывание Socket.Accept().
От: Jolly Roger  
Дата: 23.11.10 08:16
Оценка:
Здравствуйте, America, Вы писали:

Например как-то так

private AutoResetEvent cancelIO = new AutoResetEvent(false);
void AcceptThreadFunc(...)
{
    var ar = socket.BeginAccept(null, null);
    var handles = new WaitHandle[2];
    handles[0] = ar.AsyncWaitHandle;
    handles[1] = cancelIo;
    var i = WaitHandle.WaitAny(handles);
    if (i == 0) // accepted
    else // cancelled
}

Мысль, думаю, понятна.
"Нормальные герои всегда идут в обход!"
Re[2]: Прерывание Socket.Accept().
От: America  
Дата: 23.11.10 12:37
Оценка:
Здравствуйте, Jolly Roger, Вы писали:

JR>Здравствуйте, America, Вы писали:


JR>Например как-то так


JR>
JR>private AutoResetEvent cancelIO = new AutoResetEvent(false);
JR>void AcceptThreadFunc(...)
JR>{
JR>    var ar = socket.BeginAccept(null, null);
JR>    var handles = new WaitHandle[2];
JR>    handles[0] = ar.AsyncWaitHandle;
JR>    handles[1] = cancelIo;
JR>    var i = WaitHandle.WaitAny(handles);
JR>    if (i == 0) // accepted
JR>    else // cancelled
JR>}
JR>

JR>Мысль, думаю, понятна.

Ну это уже асинхронно получается, хотелось бы разобраться как с синхронным вызовом быть, ведь врятли Microsoft написали класс с методом из которого нельзя выйти без завершения программы или приёма данных.
Re[3]: Прерывание Socket.Accept().
От: Jolly Roger  
Дата: 23.11.10 12:57
Оценка:
Здравствуйте, America, Вы писали:

A>Ну это уже асинхронно получается,


Вызов WaitHandle.WaitAny превращает его в синхронный, никакой разницы нет.

A>хотелось бы разобраться как с синхронным вызовом быть, ведь врятли Microsoft написали класс с методом из которого нельзя выйти без завершения программы или приёма данных.


Найдёте — не забудьте поделиться.
"Нормальные герои всегда идут в обход!"
Re[3]: Прерывание Socket.Accept().
От: QrystaL Украина  
Дата: 23.11.10 13:29
Оценка:
A>Ну это уже асинхронно получается, хотелось бы разобраться как с синхронным вызовом быть, ведь врятли Microsoft написали класс с методом из которого нельзя выйти без завершения программы или приёма данных.

Такой код:

var s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 10000));
s.Listen(1);
new Thread(() =>
{
    try
    {
        s.Accept();
    }
    catch (SocketException e)
    {
        Trace.WriteLine(e.ToString());
    }
}).Start();
Thread.Sleep(1000);
s.Close();
Thread.Sleep(1000);


выводит

System.Net.Sockets.SocketException (0x80004005): Операция блокирования прервана вызовом WSACancelBlockingCall
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.