2012-03-18 5 views
2

Я создаю чат-программу, которая сохраняет сообщения в файлах, таких как pub0.zzc, все компьютеры, которые ее используют, будут подключены к жесткому диску, на котором находятся эти файлы, поэтому его штраф. Метод data.Chat.Read (тип MessageTypes, строковый канал) бесконечный цикл через оператор try catch, пока он не вернет сообщения. Я использовал это раньше и отлично работает. Но моему коду было сложно управлять, вместо того, чтобы просто помещать текстовые поля в окно и каждый раз использовать код, я создал пользовательский элемент управления (MessageViewer). Он работает отлично, еще раз, когда я запускаю его, НО он замораживает VS всякий раз, когда я пытаюсь использовать конструктор на окне, где находится элемент управления. probelm is not the window, потому что, когда я удаляю элемент управления, его штраф. Я думаю, что возможные ошибки в RefreshMessages() и Refresher_Tick (...)Отладка приложения для формы Windows

Refresher.Stop() и .start() также не так, работал отлично перед

так вот код:

private void Refresher_Tick(object sender, EventArgs e) 
    { 
     Refresher.Stop(); 
     int RefreshRate = 4; 
     bool Live = true; 
     if (RefreshRateChoice == "Manual") 
     { 
      Live = false; 
      RefreshRate = 1; 
     } 
     else if (RefreshRateChoice == "4 (Default)") 
     { 
      Live = true; 
      RefreshRate = 4; 
     } 
     else 
     { 
      Live = true; 
      RefreshRate = Convert.ToInt32(RefreshRateChoice); 
     } 
     if (data.Chat.Read(MessageType, ChannelChoice) != ContentPresenter.Text && Live) 
     { 
      RefreshMessages(); 
     } 
     Refresher.Interval = RefreshRate; 
     Refresher.Start(); 
    } 




    public void RefreshMessages() { 
      if (data.Chat.Read(MessageType, ChannelChoice) != ContentPresenter.Text) 
      { 
       ContentPresenter.Text = data.Chat.Read(MessageType, ChannelChoice); 
      } 
    } 

и если вам это нужно:

 public static string Read(MessageTypes Type, string Channel) 
     { 
      string Loc; 
      if (Type == MessageTypes.Public && (Channel == "1" || Channel == "2")) 
      { 
       return "Can not view this channel, only post to it."; 
      } 
      if (Type == MessageTypes.Public) 
      { 
       Loc = data.AssetsFolder + "\\pub" + Channel + ".zzc"; 
      } 
      else if (Type == MessageTypes.Private) 
      { 
       Loc = data.AssetsFolder + "\\" + Channel + ".zzpc"; 
      } 
      else if (Type == MessageTypes.Game) 
      { 
       Loc = data.AssetsFolder; 
      } 
      else 
      { 
       Loc = data.AssetsFolder; 
      } 
      while (true) 
      { 
       try 
       { 
        String MessageList = ""; 
        StreamReader MessageReader = new StreamReader(Loc); 
        string EncMessages = MessageReader.ReadToEnd(); 
        MessageReader.Dispose(); 
        List<string> EncMsgList = EncMessages.Split(';').ToList(); 
        for (int i = 1; i < EncMsgList.Count; i++) 
        { 
         MessageList += data.Encodings.Decrypt(EncMsgList[i], Palettes.Message) + "\n"; 
        } 
        return MessageList; 
       } 
       catch 
       { 
        // Do nothing 
       } 
      } 
     } 

ответ

1

вы говорите, что он "зависает".

В вашем методе чтения у вас есть цикл while (true) со встроенным блоком try ... catch, но catch не возвращает вас из этого метода. Если вы продолжаете бросать одно и то же исключение, вы продолжите цикл, над которым может быть место, где вы замерзаете.

По крайней мере, чтобы доказать, что это так, поставьте у вас возврат или какой-нибудь диагностический код, чтобы указать, так ли это.

+0

его проверка за исключением кого-то, уже использующего файл, я должен убедиться, что другие исключения вообще не происходят. то, что я закончил использовать, - это если инструкции проверяют, является ли DesignMode истинным или ложным и не запускают таймер и RefreshMessages, как кто-то в другом вопросе, если это правда, он не работает, и это сработало. – Oztaco

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