2012-03-18 7 views
2

pub0.zzc와 같은 파일에 메시지를 저장하는 채팅 프로그램을 만들면 해당 파일을 사용하는 모든 컴퓨터가 해당 파일이있는 하드 드라이브에 연결되므로 정상적으로 작동합니다. 메소드 data.Chat.Read (MessageTypes type, string Channel) 무한 루프는 메시지를 리턴 할 때까지 try catch 문을 반복합니다. 나는 이것을 사용했고 완벽하게 작동합니다. 그러나 코드를 관리하기가 어려웠으므로 텍스트 상자를 창에 넣고 매번 코드를 사용하는 대신 사용자 컨트롤 (MessageViewer)을 만들었습니다. 그것은 잘 작동, 다시 한번 그것을 실행할 때마다하지만, 때마다 내가 컨트롤을 수용하는 창에서 디자이너를 사용하려고 VS를 동결. 문제가 창을 지울 때 컨트롤을 삭제하면 문제가 발생하지 않습니다. 그래서 여기Windows 양식 응용 프로그램 디버그

코드 전에, 잘 작동 나는 가능한 오류 (RefreshMessages에서 생각)과 Refresher_Tick (...)

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

이미 파일을 사용중인 사람의 예외를 확인하면 다른 예외가 발생하지 않도록해야합니다. 내가 사용한 결과는 DesignMode가 참인지 거짓인지를 확인하고 타이머와 RefreshMessages를 실행하지 않는 if 문이 다른 질문에있는 사람처럼 제안했는지, 실제로 작동하는지는 알 수 없다는 것입니다. – Oztaco

관련 문제