2012-03-18 7 views
2

pub0.zzcのようなファイルにメッセージを保存するチャットプログラムを作成すると、それを使用しているすべてのコンピュータがこれらのファイルが格納されているハードドライブに接続されます。メソッドdata.Chat.Read(MessageTypes type、string Channel)は、メッセージを返すまでtry catchステートメントを通して無限ループします。私は以前これを使っていて、完璧に動作します。しかし、私のコードは管理するのが難しかったので、テキストボックスをウィンドウに配置して毎回コードを使用するのではなく、ユーザーコントロール(MessageViewer)を作成しました。それは、私がそれを実行するときにもう一度、うまく動作しますが、私はいつでも私がコントロールを格納するウィンドウでデザイナーを使用しようとすると、フリーズVS。私はコントロールを削除するときに問題がないので、問題はありません。私は(可能性のあるエラーが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

あなたが言うことその "フリーズ。"

Readメソッドではtry ... catchブロックが埋め込まれたwhile(true)ループがありますが、catchメソッドはそのメソッドからあなたを返すことはありません。あなたが同じ例外を投げつけ続けるならば、あなたは凍っているところにあるかもしれない繰り返しループし続けます。

少なくともそのことを証明するには、それを示すためにキャッチまたは診断コードを返してください。

+0

ファイルをすでに使用している人の例外をチェックするために、私は他の例外もどうにか起こらないようにしなければなりません。私が使用し終わったのは、ifステートメントがDesignModeがtrueまたはfalseであるかどうかをチェックし、別の質問の誰かのように、タイマとRefreshMessagesを実行していないかどうかを確認することです。 – Oztaco

関連する問題