0

我有一个使用 BackgroundWorker 执行一系列测试的表单。我使用 ProgressChanged 事件将消息发送到主线程,然后主线程执行 UI 上的所有更新。我已经梳理了我的代码,以确保我没有对后台工作人员中的 UI 做任何事情。我的代码中没有 while 循环,BackgroundWorker 的执行时间有限(以秒或分钟为单位)。但是,由于某种原因,当我锁定我的计算机时,当我重新登录时,应用程序通常会挂起。问题是,发生这种情况时,BackgroundWorker 甚至都没有运行。我认为它与 BackgroundWorker 相关的原因是因为表单仅在加载应用程序后执行 BackgroundWorker 时挂起(它仅在给定特定用户输入时运行)。

我通过 RunWorkerAsync 方法从 UI 中的 TreeView 向该线程传递了一个 TreeNode 列表,但我只在工作线程中读取这些节点。我对它们所做的任何修改都是通过 progressChanged 事件在 UI 线程中完成的。

我确实在我的工作线程中使用 Thread.Sleep 以定时间隔执行测试(这涉及通过 TCP 套接字发送消息,该套接字不是在工作线程中创建的)。

我对为什么我的应用程序可能会挂起感到完全困惑。我确定我在某处做“非法”的事情,我只是不知道是什么。

4

3 回答 3

1

我通过 RunWorkerAsync 方法从 UI 中的 TreeView 向该线程传递了一个 TreeNode 列表,但我只在工作线程中读取了这些节点。

通过“只读”,我假设您的意思是“仅访问属性获取器”。但是属性 getter 可以执行您无法控制的代码 - 例如 TreeNode.IsSelected 将调用本机方法并发送 Windows 消息(看看 Reflector)。

相反,您应该从 UI 线程中的 TreeView 中提取您需要的数据并将其传递给后台工作人员。您不仅可以避免这个问题,而且您的设计也会更加松散耦合。

于 2010-06-16T17:58:29.090 回答
0

听起来像是在UserPreferenceChanged没有消息泵的情况下在后台线程上创建了一个 ui 组件的可怕事件问题。主 ui 线程将事件同步发送到所有注册的 ui 窗口,将挂起,因为后台工作线程上的 ui 组件无法处理该UserPreferenceChanged事件。

于 2010-12-30T21:45:54.640 回答
0

好吧,这个很旧,但事实证明这个问题与我的代码完全无关。由于最近我们的软件发生了变化,日志记录量呈指数增长,我们的日志缓冲区溢出导致应用程序崩溃。这只是一个巧合,发生在我处理这段特定代码的同时。无论如何,我仍然确保我没有对 BackgroundWorker 的 UI 元素进行任何操作,即使它与选中/取消选中 TreeNode 一样微不足道。

于 2011-05-26T23:57:41.147 回答