c# - 调试 Windows 窗体应用程序

标签 c# winforms visual-studio debugging winapi

我正在制作一个聊天程序,将消息保存在 pub0.zzc 等文件中,所有使用它的计算机都将连接到这些文件所在的硬盘驱动器,所以没问题。 data.Chat.Read(MessageTypes type, string Channel) 方法通过 try catch 语句无限循环,直到它返回消息。我以前用过这个并且效果很好。但是,我的代码很难管理,所以我不是每次都将文本框放入窗口并使用代码,而是创建了一个用户控件 (MessageViewer)。它工作正常,当我再次运行它时,但每当我尝试在包含控件的窗口上使用设计器时,它就会卡住 VS。问题不是窗口,因为当我删除控件时它很好。我认为可能的错误在 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
                }
            }
        }

最佳答案

你说它“卡住”。

在您的 Read 方法中,您有一个带有嵌入式 try...catch block 的 while(true) 循环,但 catch 永远不会从该方法返回给您。如果你一直抛出相同的异常,你将继续一遍又一遍地循环,这可能是你卡住的地方。

至少要证明是这种情况,请在您的捕获中放入一个返回值或一些诊断代码以指示是否是这种情况。

关于c# - 调试 Windows 窗体应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9755307/

相关文章:

c# - 如何在 c# 中测量从 Windows XP 到 Windows 8 的进程上传和下载网络利用率?

c# - 如何在 C# 中的列表框中插入复选框?

winforms - 将 PDF 文件显示到 WinForms 中

visual-studio - 在 Visual Studio C++ 2009 中将源文件存储在项目文件目录之外

c# - 使用正则表达式删除字典条目

c# - 错误 : "Operator ' = =' can' t be applied to operators of type 'object' and 'int'

c# - 在数据库表之间形成关系 (C#)

visual-studio - Apache、IIS ...新手的服务器说明

visual-studio - 相当于 dotnet core/csproj 中的 AssemblyInfo

c# - 使用 ISerializable 反序列化 .NET 字典