c# - 当我在单独的线程上将随机数添加到列表框时,UI 卡住

标签 c# multithreading winforms loops invoke

当我加载 Windows 窗体时,使用新线程,我每秒向列表框添加一个随机数,当它达到 10 个数字时,我生成一组新的 10 个随机数。但是,目前,我遇到了 UI 线程的问题。随机数被添加到列表框中,但我无法控制表单。当我尝试与表单交互时,UI 卡住。我是否错误地使用了 MethodInvoker。任何建议将不胜感激。

public Form1()
    {
        InitializeComponent();
        Thread ranThread = new Thread(new ThreadStart(RandomList));
        ranThread.IsBackground = true;
        ranThread.Start();         
    }

public void RandomList()
    {
        stack = new Stack<int>(); 
        while (loop)
        {
            if (lbxStackRndNum.InvokeRequired)
            {
                lbxStackRndNum.Invoke(new MethodInvoker(delegate
                    {
                        Random rnd = new Random();

                        if (lbxStackRndNum.Items.Count == 10)
                        {
                            stack.Clear();
                            lbxStackRndNum.Items.Clear();
                        }

                        int rndVal = rnd.Next(1, 10000);
                        stack.Push(rndVal);
                        lbxStackRndNum.Items.Insert(0, rndVal);
                        Thread.Sleep(1000);
                    }));
            }
        }
    }

最佳答案

您正在调用的委托(delegate)中调用 Thread.Sleep(1000),这意味着它将使 UI 线程休眠而不是 ranThread

public void RandomList()
{
    stack = new Stack<int>(); 
    while (loop)
    {
        if (lbxStackRndNum.InvokeRequired)
        {
            lbxStackRndNum.Invoke(new MethodInvoker(delegate
                {
                    Random rnd = new Random();

                    if (lbxStackRndNum.Items.Count == 10)
                    {
                        stack.Clear();
                        lbxStackRndNum.Items.Clear();
                    }

                    int rndVal = rnd.Next(1, 10000);
                    stack.Push(rndVal);
                    lbxStackRndNum.Items.Insert(0, rndVal);
                }));
              Thread.Sleep(1000);
        }
    }
}

关于c# - 当我在单独的线程上将随机数添加到列表框时,UI 卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16265571/

相关文章:

c# - 使用 BookSleeve 维护一个开放的 Redis 连接

java - 理解java中实现Runnable的线程

c# - 更高效地将 WinForms 转换为 WPF 或将 WPF 转换为 Winforms

c# - JavaScript 函数不工作

c# - 这个简单的 Log4Net 包装器可以改进吗?

c# - 多个 Backgroundworkers + C#

c# - 如何隐藏 DataGridViewComboBoxColumn 的下拉箭头,如 Visual Studio Properties 窗口?

c# - .NET core 3.1 中未找到 MenuItem 和 ContextMenuItem

c# - 是否可以在 .NET Standard 项目的 session 中设置和获取值

java - 在没有锁定的情况下从多个线程写入同一个文件,Java