【发布时间】:2011-06-09 23:30:13
【问题描述】:
我有一个WindowsForm 项目,它正在运行两个BackgroundWorker 对象,用于测试是否应该收集数据以及收集数据。这些似乎运行正常,但是当我添加查看收集的数据的功能时,表单会在尝试绘制可用数据时冻结。
单击第一个按钮时,数据将在带有列表框的新表单窗口中列出。在这个新窗口上,如果看起来没问题,我还有另一个用于绘制数据的按钮。
这是整个项目冻结的地方。我尝试过而不是将传递给新表单的类引用软复制,而是在构造函数中创建一个新对象。只要数据收集BackgroundWorker 没有运行,它似乎工作正常。当收集发生时,点击绘图按钮冻结表单,数据显示按钮工作正常。
private void wellStatusButton1_Click(object sender, EventArgs e)
{
try
{
ListDataForm temp = new ListDataForm(tubes[0], 1);
temp.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void plotDataButton_Click(object sender, EventArgs e)
{
try
{
GraphForm plotData = new GraphForm(at);
plotData.ShowDialog();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
【问题讨论】:
-
你确定它在后台线程而不是 UI 线程上运行。尝试调试它...
-
我们至少需要查看问题代码的实现。除了您正在创建几个对象这一事实之外,您的示例代码没有告诉我们任何信息。
-
要测试线程是什么,请在创建线程时设置 thread.Name 属性,并在应用程序的主线程上开始确定调试时哪个线程在做什么。
-
由于这里提供的信息有限,一些提示可以帮助您找出问题所在: 提示 1:在调试模式下启动应用程序,当您检测到应用程序挂起时,按 Ctrl+Alt+PauseBreak,调试器将停。您应该会看到无限循环或可能出现同步锁定问题。使用调试器像狗寻找骨头一样寻找问题... 提示 2:使用线程窗口,调试菜单 > 窗口 > 线程 提示 3:确认 ShowDialog 模式窗口没有隐藏在主窗体后面?让它看起来冻结?
标签: c# backgroundworker