Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.69.151] |
|
Сообщ.
#1
,
|
|
|
В потоке открывается сокет. Клиент успешно коннектится, идёт обмен данными. И в момент отправки данных клиента серверу клиента закрывают. Сервер при этом виснет на методе Socket.Recieve(byte[]), так как сокет уже неживой (в окне дебагера:
Connected error: cannot obtain value bool ) - поток не завершается. Перед ресивом пробовал и проверять на Socket.Connected, и Auto[Manual]ResetEvent.WaitOne() (Set устанавливал при завершении программы) - не помогает. Радикальный вариант - Abort этого потока. Но при [code] try { thread.Abort(); } catch(ThreadAbortException) { } [\code] его выполнении вылетает окно JIT Debuggin "An exception 'System.Threading.ThreadAbortException' has occured in AbortTest.exe." Подскажите, плиз, выход из этой ситуации. |
Сообщ.
#2
,
|
|
|
а без дебага вылетает exception? я точно не помню, но вроде как отладчик прерывается даже на пойманных исключениях...вроде как на неотловленные он ругается unhandled...хотя я не уверен.
Добавлено кстати, там есть кнопочка Copy exception details to clipboard...полезная штука при разборе полётов Добавлено кстати, по сути самой проблемы с сокетом: не оч хорошо в них разбираюсь, но думаю тебе стоит посмотреть хелп по следующему: |
Сообщ.
#3
,
|
|
|
Рылся в сокетах довольно плотно и такого не встречал - что-то у тебя неправильно с самим принципом действия. Рекомендую использовать асинхронные методы, а не ручную многопоточность - эффект тот же, а глюков меньше, т.к. под ручную классы не заточены.
А вообще приведи код, может и можно что-то придумать. Добавлено Хотя нет - вспомнил, похожая байда и у асинхронного BeginReceive - только у него всё вполне гладко перехватывается Exception'ом. |
Сообщ.
#4
,
|
|
|
Цитата archimed7592 @ а без дебага вылетает exception? я точно не помню, но вроде как отладчик прерывается даже на пойманных исключениях...вроде как на неотловленные он ругается unhandled...хотя я не уверен. С дебагером не вылетает. Когда релиз делаю, тоже не ругается. Ругается только, когда exe отрабатывает. Очень странно. Хотелось бы разобраться почему -Added Цитата Neco @ Рекомендую использовать асинхронные методы, а не ручную многопоточность - эффект тот же, а глюков меньше, т.к. под ручную классы не заточены. Придумал решение - сокет, чей метод Receive вызывается, выносится как private объект. В нужное время этот сокет закрывается. Зависать перестала программа :-) Остался открытым вопрос о ThreadAbortException. |
Сообщ.
#5
,
|
|
|
_oz_
Цитата _oz_ @ Ругается только, когда exe отрабатывает это как? когда приложение закрываешь? Цитата _oz_ @ Остался открытым вопрос о ThreadAbortException. непонятно откуда ты вызываешь Abort (). из какого потока? почитай MSDN...там про это исключение много чё написано. вот пример кода от туда же: using System; using System.Threading; using System.Security.Permissions; public class ThreadWork { public static void DoWork() { try { for (int i = 0; i < 100; i++) { Console.WriteLine("Thread - working."); Thread.Sleep(100); } } catch (ThreadAbortException e) { Console.WriteLine("Thread - caught ThreadAbortException - resetting."); Console.WriteLine("Exception message: {0}", e.Message); Thread.ResetAbort(); } Console.WriteLine("Thread - still alive and working."); Thread.Sleep(1000); Console.WriteLine("Thread - finished working."); } } class ThreadAbortTest { public static void Main() { ThreadStart myThreadDelegate = new ThreadStart(ThreadWork.DoWork); Thread myThread = new Thread(myThreadDelegate); myThread.Start(); Thread.Sleep(100); Console.WriteLine("Main - aborting my thread."); myThread.Abort(); myThread.Join(); Console.WriteLine("Main ending."); } } |
Сообщ.
#6
,
|
|
|
Спасибо!
|