На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Сокеты и потоки , c#
    В потоке открывается сокет. Клиент успешно коннектится, идёт обмен данными. И в момент отправки данных клиента серверу клиента закрывают. Сервер при этом виснет на методе 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."

    Подскажите, плиз, выход из этой ситуации.
      а без дебага вылетает exception? я точно не помню, но вроде как отладчик прерывается даже на пойманных исключениях...вроде как на неотловленные он ругается unhandled...хотя я не уверен.

      Добавлено
      кстати, там есть кнопочка Copy exception details to clipboard...полезная штука при разборе полётов :)

      Добавлено
      кстати, по сути самой проблемы с сокетом: не оч хорошо в них разбираюсь, но думаю тебе стоит посмотреть хелп по следующему:
      • Socket.Blocking
      • Socket.ReceiveTimeout
      • Socket.BeginReceive ()
        Рылся в сокетах довольно плотно и такого не встречал - что-то у тебя неправильно с самим принципом действия. Рекомендую использовать асинхронные методы, а не ручную многопоточность - эффект тот же, а глюков меньше, т.к. под ручную классы не заточены.
        А вообще приведи код, может и можно что-то придумать.

        Добавлено
        Хотя нет - вспомнил, похожая байда и у асинхронного BeginReceive - только у него всё вполне гладко перехватывается Exception'ом.
          Цитата archimed7592 @
          а без дебага вылетает exception? я точно не помню, но вроде как отладчик прерывается даже на пойманных исключениях...вроде как на неотловленные он ругается unhandled...хотя я не уверен.

          С дебагером не вылетает. Когда релиз делаю, тоже не ругается. Ругается только, когда exe отрабатывает. Очень странно. Хотелось бы разобраться почему :)

          -Added
          Цитата Neco @
          Рекомендую использовать асинхронные методы, а не ручную многопоточность - эффект тот же, а глюков меньше, т.к. под ручную классы не заточены.

          Придумал решение - сокет, чей метод Receive вызывается, выносится как private объект. В нужное время этот сокет закрывается. Зависать перестала программа :-) Остался открытым вопрос о ThreadAbortException.
            _oz_
            Цитата _oz_ @
            Ругается только, когда exe отрабатывает

            :o это как? когда приложение закрываешь?


            Цитата _oz_ @
            Остался открытым вопрос о ThreadAbortException.

            непонятно откуда ты вызываешь Abort (). из какого потока?
            почитай MSDN...там про это исключение много чё написано.
            вот пример кода от туда же:
            ExpandedWrap disabled
              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.");
                  }
              }
              Спасибо!
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0292 ]   [ 16 queries used ]   [ Generated: 19.04.24, 04:25 GMT ]