C# 调试windows窗体应用程序

C# 调试windows窗体应用程序,c#,winforms,visual-studio,debugging,winapi,C#,Winforms,Visual Studio,Debugging,Winapi,我正在制作一个聊天程序,将信息保存在pub0.zzc之类的文件中,所有使用它的计算机都将连接到这些文件所在的硬盘上,这样就可以了。方法data.Chat.Read(MessageTypes类型,string通道)无限循环遍历try-catch语句,直到返回消息。我以前用过这个,效果很好。但是,我的代码很难管理,因此我创建了一个用户控件(MessageViewer),而不是将文本框放到窗口中,每次都使用代码。当我再次运行它时,它工作得很好,但每当我尝试在包含控件的窗口上使用设计器时,它就会冻结。问

我正在制作一个聊天程序,将信息保存在pub0.zzc之类的文件中,所有使用它的计算机都将连接到这些文件所在的硬盘上,这样就可以了。方法data.Chat.Read(MessageTypes类型,string通道)无限循环遍历try-catch语句,直到返回消息。我以前用过这个,效果很好。但是,我的代码很难管理,因此我创建了一个用户控件(MessageViewer),而不是将文本框放到窗口中,每次都使用代码。当我再次运行它时,它工作得很好,但每当我尝试在包含控件的窗口上使用设计器时,它就会冻结。问题不在于窗口,因为当我删除控件时,它很好。我认为可能的错误在RefreshMessages()和Refresh_勾选(…)

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
                }
            }
        }
公共静态字符串读取(消息类型,字符串通道)
{
字符串Loc;
if(Type==MessageTypes.Public&&(Channel==“1”| | Channel==“2”))
{
return“无法查看此频道,仅向其发布。”;
}
if(Type==MessageTypes.Public)
{
Loc=data.AssetsFolder+“\\pub”+频道+”.zzc”;
}
else if(Type==MessageTypes.Private)
{
Loc=data.AssetsFolder+“\\”+频道+“.zzpc”;
}
else if(Type==MessageTypes.Game)
{
Loc=data.AssetsFolder;
}
其他的
{
Loc=data.AssetsFolder;
}
while(true)
{
尝试
{
字符串MessageList=“”;
StreamReader MessageReader=新的StreamReader(Loc);
字符串EncMessages=MessageReader.ReadToEnd();
MessageReader.Dispose();
List EncMsgList=EncMessages.Split(“;”).ToList();
for(int i=1;i
你说它“冻结了”

在Read方法中,有一个带有嵌入的try…catch块的while(true)循环,但是catch永远不会从该方法返回您。如果您继续抛出相同的异常,您将继续循环,循环可能就是您冻结的地方


至少为了证明这一点,在catch中加上一个return或一些诊断代码,以指示是否是这种情况。

要检查已在使用该文件的人的异常,我必须确保其他异常不会发生。我最后使用的是if语句检查DesignMode是真是假,并且不运行计时器和刷新消息,就像另一个问题中的某人所建议的那样,如果它是真的,它就不会运行,这是有效的。