我如何使设计师从事件产生其他线程?

时间:2012-06-02 19:24:30

标签: c# winforms multithreading

如何让GUI事件屈服于给定的线程?通过GUI事件我的意思是打开子表单,选择不同的选项卡,或最小化/最大化我的表单或更改焦点。

当我的工作线程获取数据时,我可以将资源限制到它,并从我的应用程序中的其他进程或线程中拒绝这些资源吗?

历史:
在我的问题Here中,我解释了一个场景,我关注我的主要表单调用,导致我的关键线程挂起。然后向我透露,我可以选择“BeginInvoke”。

现在我发现虽然BeginInvoke让我在那里中途,我仍然无法避免我的关键线程中的挂起。当我说“关键线程”时,我指的是一个需要大约60ms才能循环的线程,但必须在130ms之前完成循环。它坐在那里循环,轮询数据列表。当数据显示时,通常需要40到60ms才能完成处理。

(技术上,我打算恢复)第二个线程在我的表单中抛出BeginInvokes来更新用户运行状态。我目前,出于调试目的,我没有这样做。

我做了一些分析,我注意到我几乎总是将处理时间保持在100ms以下,这是我需要的,因为我的应用程序需要在下一个数据包出现时(每100ms)输出结果,但是对于这个例子,我把它减慢到130ms)。当我与表单交互时,通过更改焦点或最小化/最大化它,我可以看到我的处理时间高于1秒。我认为这是因为愚蠢的事情,如最小化或最大化,或其他重新绘制事件,正在掠夺我所有宝贵的时钟时间。

平台:
我正在使用Visual C#2008和WinForms。目标计算机运行Windows XP。我试图关闭Windows资源管理器,并在Normal,High和Realtime上运行我的应用程序优先级,但在操作表单时我仍然看到几乎相同的影响。

修改 我试图在工作循环期间的关键时刻使用Thread.CurrentThread.Priority来限制我的优先级。这在某种程度上无法从我的GUI中获取这些资源,并且涉及重绘GUI的操作仍然统治着我糟糕的工作线程。

1 个答案:

答案 0 :(得分:1)

您是否尝试使用Thread.Priority属性将工作类的线程优先级设置为RealTime?

根据Scheduling Priorities的描述,这应该为您的工作线程提供更高的优先级。但是,这会导致GUI断断续续,因此您可能只想在关键时间段内将优先级设置为高。