2009-11-04 2 views
1

может кто-нибудь сказать мне, почему мой код не работает?Вопрос о выпуске на C#

class Connection 
{ 
    public static StreamWriter writer; 
    public static string SERVER; 
    private static int PORT; 
    private static string USER; 
    private static string NICK; 
    private static string CHANNELS; 
    private Thread connection; 
    private Thread ping; 
    public Connection() 
    { 
     connection = new Thread(new ThreadStart(this.Run)); 
     ping = new Thread(new ThreadStart(this.Ping)); 
    } 
    public void Start(string server, int port, string ident, string realname, string nick, string channels) 
    { 
     SERVER = server; 
     PORT = port; 
     USER = "USER " + ident + " 8 * :" + realname; 
     NICK = nick; 
     CHANNELS = channels; 
     connection.Start(); 
    } 
    public void Ping() 
    { 
     while (true) 
     { 
      try 
      { 
       Connection.writer.WriteLine("PING :" + SERVER); 
       Connection.writer.Flush(); 
       Thread.Sleep(15000); 
      } 
      catch (Exception e) { Console.WriteLine(e.ToString()); } 
     } 
    } 
    public void Run() 
    { 
     NetworkStream stream; 
     TcpClient irc; 
     string inputLine; 
     StreamReader reader; 
     try 
     { 
      irc = new TcpClient(SERVER, PORT); 
      stream = irc.GetStream(); 
      reader = new StreamReader(stream); 
      writer = new StreamWriter(stream); 
      writer.WriteLine(USER); 
      writer.Flush(); 
      writer.WriteLine("NICK " + NICK); 
      writer.Flush(); 
      Thread.Sleep(5000); 
      writer.WriteLine("JOIN " + CHANNELS); 
      writer.Flush(); 
      while (true) 
      { 
       while ((inputLine = reader.ReadLine()) != null) 
       { 
        Console.WriteLine(inputLine); 
       } 
       writer.Close(); 
       reader.Close(); 
       irc.Close(); 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine(e.ToString()); 
      Thread.Sleep(5000); 
      Run(); 
     } 
    } 
} 

Он прекрасно подключается к серверу, но пинг Thread и пустоты вообще не функционируют! и я не знаю почему, все кажется правильным, если им не хватает чего-то очень очевидного.

ответ

4

Вы еще не запустили свою нить ping. Позвоните по телефону Start.

Другое примечание - не используйте Thread.Sleep для синхронизации потоков/процессов. По моему опыту, использование этого кода обычно медленное, ненадежное и сложное в обслуживании. Используйте классы Monitor или различные версии WaitHandle (например, AutoResetEvent) или что угодно. Для связи клиент/сервер старайтесь дождаться ответа сервера на ваш запрос (если таковой определено в протоколе), а не только таймаута.

Кроме того, если вы начинаете новые потоки, остановите эти потоки (например, в методе Dispose вашего класса) или установите IsBackground или, желательно, оба. В противном случае эти потоки заблокируют ваш процесс от остановки.

+0

+1 избили меня до этого ... –

+0

Я не верю, что этот пример использует Sleep для синхронизации. Фактически это используется для спящего режима для паузы - например, для Ping каждые 15 секунд или около того. Я бы сказал, что это пример использования Сна законно. –

+0

Возможно, я неправильно понял. Но, похоже, он отправляет запрос на IRC-сервер, ждет некоторое время (хотя сервер обычно пишет правильный ответ), а затем отправляет другой запрос. Поэтому он используется для синхронизации процессов, а не потоков, но тем не менее. Но я изменю свой пост, чтобы быть более осторожным в формулировке. –

Смежные вопросы