【问题标题】:C# - Application randomly locking up when interacting with the UIC# - 与 UI 交互时应用程序随机锁定
【发布时间】:2012-05-02 16:20:38
【问题描述】:

所以我对 C# 很陌生,但我正在开发一个相当大的线程应用程序,该应用程序一直在锁定。

我要么单击一个按钮来启动一个新表单,要么尝试调整表格的大小,它会被锁定,我必须退出程序。

有人对我如何调试有任何想法吗?如果我只是单击 Break All 它会将我带到 Application.Run(Forms.AllForms.MainForm);这不是很有帮助。

对 Visual Studio 有点陌生(我是 Obj-C 开发人员),但是否有调试器选项可以让我退后一步查看调用堆栈,这可能表明为什么会发生这种情况?

我也在使用氪星组件,不知道这是否重要。

提前致谢!

【问题讨论】:

  • 我想知道的是,其他线程是否应该访问 UI 元素?这会导致这个问题吗? (因为我的应用会这样做)
  • 其他线程在任何情况下都不应该访问 UI。从技术上讲,您可以这样做,但这是一种非常糟糕的做法,您应该不惜一切代价避免它。您可能应该切换到 BackgroundWorker 而不是线程,并在 ProgressChanged 或 WorkComplete 事件中访问 UI,您将从工作人员的工作方法中调用。
  • 使用 BackgroundWorker 是否不需要我设置委托(使用 Invoke)来更新 UI 元素?
  • 不完全。您向 BGW 的实际 Work 方法、ProgressChanged 方法(可选)提供委托,该方法将使用 bgw.ReportProgress(percentsDone); 从 Work 方法中调用,以及 WorkDone 方法(可选)将在 Work 方法完成时调用任何原因。 Work 方法将被视为一个单独的线程,但是 ProgressChanged 和 WorkDone 方法将在主线程上调用。

标签: c# visual-studio-2010 krypton-toolkit


【解决方案1】:

您可能在主线程上做了一些繁重的工作,而不是某个地方的单独线程。

简单的方法是在按钮单击事件上设置一个断点并按下它,然后慢慢按下 浏览代码,看看是否有任何应该线程化的东西,或者某种无限循环。

如果您不介意,请发布您的一些代码并解释该程序,以便我们可以更好地帮助您。

【讨论】:

  • 这不仅仅是一键点击,而是在奇怪的地方。后台线程继续运行 UI 只是锁定。有没有办法我可以在 UI 线程上“中断”然后查看调用堆栈?现在在按钮上尝试您的建议。
  • 找出发生这种情况的场景并朝那个方向进行调查。
  • 再说一次,如果您发布代码,甚至上传完整的应用程序,正如您所说的那样,这一切都很混乱,那么将您引导到解决方案会更容易。
  • 所以在一种情况下,我发现问题是一个线程正在更新列表框。我应该像正常一样运行我的应用程序并将 Control.CheckForIllegalCrossThreadCalls 设置为 true 吗?然后检查每个异常 + 验证它没有从另一个线程更新 UI?我相当肯定这就是问题所在。不幸的是我无法上传源代码:/
  • 好的,我在单步执行表单时将其缩小为 .show。前两次我加载表单很好,但第三次它锁定 - 有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多