c# - Winforms C# - 主 UI 线程繁忙时显示取消对话框

标签 c# winforms multithreading user-interface dialog

我有一个主窗体,其中包含一个占据整个窗体的编辑控件。还有另一个工作线程不断地将日志消息写入此编辑控件。现在,我想在主 UI 的编辑控件显示内容时显示一个仅带有取消按钮的对话框。问题是取消对话框没有响应,而更新正在其后面发生,并且我无法单击取消按钮。关于如何解决它的任何想法。我正在考虑创建另一个 UI 线程并显示其中的取消按钮。还有其他选择吗?

编辑#1

  1. 我应该澄清一下,我已经使用工作线程来完成这项工作。
  2. DisplayLogs() 在单独的线程中。
  3. 从其他线程调用 DisplayLogs()。
  4. LogMessage 是指向主 UI 中 UpdateMessage 方法的委托(delegate)。
  5. 使用的控件是 TextBox。我尝试过其他控件,例如 ListView , richtextboxsand 等仍然是相同的结果。

工作线程

void DisplayLogs()
{
    lock (this)
    {
        while (logQueue.Count > 0)
        {
            string logMessagemessage = logQueue.Dequeue();
            LogMessage(string.Concat(logMessagemessage, Environment.NewLine));
        }
    }
}

主界面

public void UpdateMessage( string message)
{
    if (!txtLog.IsHandleCreated)
    {
        return;
    }

    if (txtLog.InvokeRequired)
        txtLog.BeginInvoke( new UpdateLogDelegate( UpdateLog), message);
    else
        txtLog.AppendText(message);
}

最佳答案

主要解决方案是将昂贵的代码卸载到后台工作人员上,并让您的 UI 线程响应 UI 操作。然后,您的表单可以简单地显示模式对话框或其他内容。

MSDN - How to use a Background Worker

关于c# - Winforms C# - 主 UI 线程繁忙时显示取消对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8230337/

相关文章:

c# - 从 C# 调用 python 脚本

c# - 将Json反序列化为对象和子对象返回

c# - 创建新的 C# 文件时命名空间错误?

winforms - 使用向左和向右箭头键选择上一个/下一个菜单而不是下一个/上一个菜单

c - 在多线程程序中共享内存有优势吗?

c# - asp.net,C#中Fileupload控件的维护值

c# - 如何将工具提示添加到 winform 上的用户定义文本框

c# - 从上到下的尺寸

java - 在循环中创建线程

multithreading - Rust 中与外部进程的多线程通信