Запускаю в отдельном потоке прослушивание порта Socket.Accept. Нужно чтоб пользователь мог отменить прослушку, пробовал делать так:
thrd.Abort() — на это поток никак не откликается, исключение ThreadAbortException в потоке не возникает, если сделать thrd.Join() к вызывающему потоку, то из метода возвращение не происходит(поток зависает).
Пробовал Socket.Close() и Socket.ShutDown() возникают исключения, но даже ели их отлавливать всёравно проваливаются в метод Main с исключением TargetInvocationException().
В гугле по этому поводу других предложений нет. Можно ли как-нибудь снфть блокировку с потока, вызывающего Socket.Accept()?
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) // acceptedelse// cancelled
}
Здравствуйте, 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 написали класс с методом из которого нельзя выйти без завершения программы или приёма данных.
Здравствуйте, America, Вы писали:
A>Ну это уже асинхронно получается,
Вызов WaitHandle.WaitAny превращает его в синхронный, никакой разницы нет.
A>хотелось бы разобраться как с синхронным вызовом быть, ведь врятли Microsoft написали класс с методом из которого нельзя выйти без завершения программы или приёма данных.
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