【发布时间】: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