【问题标题】:c# windows form fails to respond on a click actionc# windows 窗体无法响应单击操作
【发布时间】: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


【解决方案1】:

很难从您的问题中获得很多信息,但可能对您有用的一件事是:当 Windows 程序在后台执行其他操作时,通常 UI 可能会被冻结。您可以尝试定期使用:Application.DoEvents(),这将使 UI 看起来更具响应性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多