2012-03-18 143 views
2

我正在製作一個聊天程序,將消息保存在像pub0.zzc這樣的文件中,所有使用它的計算機都將連接到這些文件所在的硬盤驅動器,所以它很好。方法data.Chat.Read(MessageTypes類型,字符串Channel)通過try catch語句無限循環,直到它返回消息。我之前使用過這個並且完美地工作。但是,我的代碼很難管理,因此我不是每次都將文本框放入窗口並使用代碼,而是創建了一個用戶控件(MessageViewer)。它運行良好,我再次運行它時,但它凍結VS,每當我嘗試使用控制器窗口上的設計師。該probelm不是窗口,因爲當我刪除控制它的罰款。我認爲可能出現的錯誤是在RefreshMessages()和Refresher_Tick(...)調試Windows窗體應用程序

Refresher.Stop()和。開始()也沒有它,工作得很好以前

所以這裏是代碼:

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

你說,它 「凍結」。

在你的Read方法中,你有一個嵌入try ... catch塊的while(true)循環,但catch永遠不會從這個方法返回。如果你繼續拋出同樣的異常,你會繼續循環,這可能是你正在凍結的地方。

至少要證明是這種情況,請在您的返回或一些診斷代碼中指出是否是這種情況。

+0

它檢查已經使用該文件的人的異常,我必須確保其他異常不會發生。我最終使用的是如果語句檢查DesignMode是true還是false,並且不運行計時器和RefreshMessages,就像另一個問題中的人所建議的那樣,如果它是真的,它不運行,這是有效的。 – Oztaco 2012-03-18 02:27:31