C# - 紧凑框架 Windows CE - GUI 线程阻止更高优先级线程

标签 c#

我遇到一个问题,我有一个用 C# 编写的 Windows CE 紧凑框架应用程序,其中我将主 GUI 线程设置为正常优先级,并将通信线程设置为高于正常优先级,以尽可能接近伪实时性能。我遇到的问题是在按钮处理程序中,我运行一个循环将配置数据从文件加载到 GUI,然后再允许对其进行编辑。这大约需要 2-3 秒才能完成。当事件处理程序中发生这种阻塞时,我的更高优先级的通信线程被阻塞。没有锁,线程同步到位。通信线程不依赖于GUI线程。

这就是我生成通讯线程的方式:

        MbWorkerThread = new Thread(MbPollingThread);
        MbWorkerThread.IsBackground = true;
        MbWorkerThread.Priority = ThreadPriority.AboveNormal;
        MbWorkerThread.Start();

这是一个 MTA 应用程序。另外,我尝试在 GUI 事件处理程序中使用 Thread.Sleep(1) 来让出更高优先级的线程,但它不起作用。我还尝试使用信号来屈服于更高优先级的线程,但这不起作用。唯一有效的是,如果我在事件处理程序中加载配置时将 Application.DoEvents() 放入循环中。这只是一个测试,因为我不想在我的代码中撒上 Application.DoEvents() 来使其工作,因为我知道 Application.DoEvents() 是危险的。

我的理解是,主 GUI 线程是一个前台线程,但仍然是一个线程。另外,我将通信线程设置为后台线程,只是为了让它在主线程退出时被杀死。

在问这个问题之前,我已经尝试了一切,在互联网上无休止地搜索。

任何帮助将不胜感激。

附注- 我想过一个表单计时器,但我知道它在 GUI 线程中运行,所以这没有帮助。我想到了另一个线程,但我真的不知道如何通过 Invoke 来整理 GUI 更新。

最佳答案

您的程序从 Main() 开始,您通常会在其中调用 Application.Run( new MyForm() )Application.Run() 实现标准的 Windows 消息泵,它处理来自操作系统和其他应用程序的消息,包括用户输入、进程间通信、重绘请求等。

GUI 事件(例如按钮单击)是通过此线程调度的。如果您在事件处理程序中执行长时间运行的工作,则不会处理其他消息。

Application.DoEvents() 阻塞调用线程,并等待处理所有挂起的消息。如果 DoEvents 对您的通信线程有帮助,而 Sleep(1) 没有,那么我怀疑您的通信线程和 GUI/消息泵线程之间存在依赖关系。

即使情况并非如此,阻塞 GUI 线程也不是一个好主意。使用 ThreadPool.QueueUserWorkItem() 将文件加载移动到后台,并在最后使用 InvokeBeginInvoke 将结果编码(marshal)回 UI。

关于C# - 紧凑框架 Windows CE - GUI 线程阻止更高优先级线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6930774/

相关文章:

c# - 如何处理 CefSharp 中的鼠标单击以前后导航

c# - NPOI HSSF 与 SS 命名空间

c# - UpdateResource 不适用于 lpType 作为字符串

c# - Qt creator - 如何启用对齐线?

c# - FormView.FindControl() : object reference error

c# - 数据绑定(bind)不更新属性更改 (UWP)

c# - 如何更新绑定(bind)到 WPF 中的集合的 ListView 项?

c# - 简单使用 RSACryptoServiceProvider KeyPassword 失败

c# - Windows 7中的捕获删除操作(首选)

c# - 如何从对象列表中获取字符串值并将它们添加到下拉列表中?