gpt4 book ai didi

c# - 我在线程方面做错了什么?

转载 作者:太空狗 更新时间:2023-10-30 00:33:28 26 4
gpt4 key购买 nike

概要:

我正在尝试将非线程应用程序转换为线程应用程序。我已经有大约 10 年没有在应用程序中使用线程了,并且对这个概念非常生疏。只是有些事情我没有掌握。你能看看我的(非常短的)之前和之后的代码,看看我做错了什么以及为什么错了吗?非常感谢所有帮助!谢谢!

看到的错误:

我的代码没有响应。我可以运行并执行按钮来启动应用程序,而不是启动一个新线程并正常工作,它们会卡住并显示“无响应”消息。我不确定我做错了什么。我只是错误地实现了线程吗?

非线程代码:

//this opens the user input windows form
private void UserInputButton_Click(object sender, EventArgs e)
{
enumerationStation EnumerationForm = new enumerationStation();
EnumerationForm.Show();
//userform UserForm = new userform();
//UserForm.Show();
}

//this opens the correlationApplication windows form
private void CorrelationApplication_Click(object sender, EventArgs e)
{
CorrelationApplication CorrelationApplicationForm = new CorrelationApplication();
CorrelationApplicationForm.Show();
}

损坏的线程代码:

//this opens the user input windows form
private void UserInputButton_Click(object sender, EventArgs e)
{
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(enumerationStuff);
bg.RunWorkerAsync();

}
//run enumeration application in new thread
private void enumerationStuff(object sender, DoWorkEventArgs e)
{
enumerationStation EnumerationForm = new enumerationStation();
EnumerationForm.Show();
}

//this opens the correlationApplication windows form
private void CorrelationApplication_Click(object sender, EventArgs e)
{
BackgroundWorker bg = new BackgroundWorker();
bg.DoWork += new DoWorkEventHandler(correlationStuff);
bg.RunWorkerAsync();
}
//run correlation application in new thread
private void correlationStuff(object sender, DoWorkEventArgs e)
{
CorrelationApplication CorrelationApplicationForm = new CorrelationApplication();
CorrelationApplicationForm.Show();
}

最佳答案

BackgroundWorkers 专为在后台工作而设计。它们并非设计用于显示新窗口或呈现任何 UI 本身——根据定义,这是前台工作。 BackgroundWorker 不处理任何消息,因此它们不会响应鼠标点击、键盘输入或任何其他操作,这就是窗口仅显示“无响应”的原因。

很难回答这个问题,因为我不太清楚您在这里实际想要实现的目标。您的第一个非线程代码有什么问题?

如果“个别应用程序”(实际上只是表单)卡住了整个应用程序,它们可能在 UI 线程中做了很多工作。在这种情况下,BackgroundWorkers 可能是一种解决方案,但您在错误的地方使用了它们。找到执行“大量工作”(无论是什么工作)的代码,看看是否可以将该代码(并且仅该代码)放入 BackgroundWorker。但是,您不能做的是从 BackgroundWorker 内部对 UI 做任何事情 - 您只有一个 UI 线程(您启动的线程),并且只有该线程可以接触 UI。

关于c# - 我在线程方面做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11759996/

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