如何使设计器制作的表单事件屈服于其他线程
本文关键字:事件 表单 屈服于 其他 线程 何使 | 更新日期: 2023-09-27 18:36:11
如何使 GUI 事件屈服于给定线程?通过GUI事件,我的意思是打开子窗体,选择不同的选项卡,或最小化/最大化我的窗体或更改焦点。
当我的工作线程获取数据时,我是否可以将资源限制到它,并拒绝来自应用程序中其他进程或线程的这些资源?
历史: 在我的问题中,我解释了一个场景,其中我关注我对主窗体的调用导致我的关键线程挂起。然后有人向我透露,我可以选择"开始调用"。
现在我发现,虽然 BeginInvoke 让我成功了一半,但我仍然无法避免关键线程的挂断。当我说"关键线程"时,我指的是一个线程,该线程需要大约 60 毫秒才能循环,但必须在 130 毫秒之前完成循环。它坐在那里循环,轮询数据列表。当数据显示时,通常需要 40 到 60 毫秒才能完成处理。
我有(从技术上讲,我计划恢复)第二个线程在我的表单上抛出 BeginInvokes 以更新用户运行状态。我目前出于调试目的没有这样做。
我做了一些分析,我注意到我几乎总是将处理时间保持在远低于 100 毫秒,这是我需要的,因为我的应用程序需要在下一个数据包出现时输出结果(每 100 毫秒,但对于此示例,我将其减慢到 130 毫秒)。当我与我的表单交互时,比如改变焦点,或者最小化/最大化它,我可以看到我的处理时间峰值超过 1 秒。我认为这是因为诸如最小化或最大化或其他重绘事件之类的愚蠢事情正在掠夺我所有宝贵的时钟时间。
平台:我正在使用Visual C# 2008和WinForms。目标计算机运行 Windows XP。我尝试关闭 Windows 资源管理器,并以"正常"、"高"和"实时"优先级运行我的应用程序,但在操作窗体时,我仍然看到几乎相同的影响。
编辑我尝试使用 Thread.CurrentThread.Priority 在工作线程循环的关键时刻限制我的优先级。这在某种程度上无法从我的 GUI 中夺走这些资源,并且涉及重绘 GUI 的操作仍然统治着我糟糕的工作线程。
您是否尝试使用 Thread.Priority 属性将 worker 类的 Thread Priority 设置为 RealTime?
根据计划优先级的说明,这应该为您的工作线程提供更高的优先级。但是,这会导致您的 GUI 卡顿,因此您可能只想在关键时间段将优先级设置为高。