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

标签 c# .net multithreading

概要:

我正在尝试将非线程应用程序转换为线程应用程序。我已经有大约 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/

相关文章:

c# - 为什么查询字符串参数包含两次 - asp.net boolean

.net - MVC 4 在前端隐藏客户端 ID 的最佳实践

c++ - Linux 套接字和线程

c# - HttpClientFactory如何注入(inject)类我无法控制核心2.1

c# - ClickOnce 安装程序先决条件 : How to auto-detect required version of Visual C++ Runtime

c# - 在 C# 中修改数组 "in-place"?

c# - 没有 SQL Server 的 Visual Studio 2012 安装

c++ - 在 OpenMP 中使用共享数据结构而不是私有(private)数据结构时的性能差异

C# 线程处理 Parallel.ForEach 和 DirectoryInfo 内存不足异常

c# - 在 .NET Compact 中模拟曲线图