当我加载 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/