gpt4 book ai didi

c# - 调用卡住我的 Windows 窗体

转载 作者:太空宇宙 更新时间:2023-11-03 23:23:58 24 4
gpt4 key购买 nike

我正在尝试做我的第一个多线程 Windows 窗体应用程序,但我有一个重要问题。我知道我必须在我的线程中使用 Invoke 或 BeginInvoke 来更改我表单中的 RichTextBox,但是当我尝试这样做时我的 UI 只是卡住,而控制台正在正确打印我的结果。

     class MyThread
{
public MyThread()
{

}


public void Run()
{
byte[] tmp;
while (true)
{

// lock (sem1)
Monitor.Enter(sem1);
{
if (end)
{
Monitor.Exit(sem1);
break;
}
tmp = inp.ReadNr();

if (inp.End())
end = true;
}
if(inOrder)
Monitor.Enter(sem2);
Monitor.Exit(sem1);

bool p = CSL.checkNr((byte[])tmp.Clone());
Monitor.Enter(sem3);
if(inOrder)
Monitor.Exit(sem2);
{
outp.WriteNr(tmp, p);
//win.richTextBox2.AppendText(String.Join("", tmp) + '\n');
win.richTextBox2.BeginInvoke(new Action(delegate ()
{
win.richTextBox2.AppendText("wtf");
}));
}
Monitor.Exit(sem3);

}
}
}

“win”是我的 Form1 类的对象。我无法处理它...

编辑:

    static public void loading()
{
outp = new oFile();
Thread[] thr = new Thread[nrThreads];
for (int a = 0; a < nrThreads; a++)
new Thread(new ThreadStart(new MyThread().Run)).Start();
//new MyThread().Run();
Console.ReadKey();
}

表格:

private void button1_Click(object sender, EventArgs e)
{
Program.loading();
}

最佳答案

这里的问题是 Program.loading 中的这一行:

Console.ReadKey();

这会停止其轨道上的主 GUI 线程,所以让我们看看现在会发生什么:

  1. 发布到主 GUI 线程的消息不会得到处理(因为您不会返回到消息循环)
  2. 来自不同线程的 BeginInvoke 不会得到处理,因为它们通过将消息发布到主 GUI 线程正在处理的同一消息队列(现已停止)来工作
  3. 直到你按下一个键(假设这是可能的),一切都会停止。您会注意到发送给表单的绘画消息不会得到处理,最终表单会淡出并显示“已停止响应”文本。

所以删除那行代码,至少你的程序不应该像以前那样停滞不前。


话虽如此,我敦促您先尝试更简单的示例。您交错、手动地处理多个显示器让我认为您正处于学习多线程编程的最开始阶段,并且已经开始学习一些复杂的齿轮,这些齿轮需要非常准确地互锁才能正常工作。

相反,我会请您查看 async/await,这是 C# 5 中添加的用于处理异步编程的新关键字。虽然异步和多线程不是一回事,也不暗示对方,但异步编程通常可以让您获得响应式 UI,在等待时不会卡住。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com