【问题标题】:In C# Form freezes when opened from callback [closed]在 C# 表单中从回调打开时冻结[关闭]
【发布时间】:2020-11-03 11:06:41
【问题描述】:

我正在开发一个带有回调函数的 C# 应用程序。 当应用收到消息时,会触发回调函数并打开一个表单来显示消息的内容。我使用 .Show() 和 .BringToFront() 来做到这一点。 但是打开的新表单窗口被冻结。我无法单击按钮,甚至无法关闭窗口。它仍然在后台。 有人能告诉我为什么会这样吗? 我正在使用 Visual Studio 2019。

回调函数:

public void currentSelectedCharacteristic_ValueChanged3(GattCharacteristic sender, GattValueChangedEventArgs args)
        {
                Allgemein.HinweisFenster.Show();
                Allgemein.HinweisFenster.BringToFront();                   
        }

【问题讨论】:

    标签: c# forms callback visual-studio-2017


    【解决方案1】:

    我们需要更多细节来解决。但我可以说有一个进程阻塞了你的主线程。尝试使用'Application.DoEvent();'或将阻塞线程的代码移动到另一个线程。并考虑为此使用“后台工作人员”。

    【讨论】:

    • 我已经在使用 'Application.DoEvent();'。在此之前,消息的值不会写入新表单,但冻结问题仍然存在。我怎么知道代码的哪一部分阻塞了我的线程?
    • 您的消息来自哪里?从设备(通过 USB 或串行)?您是否使用图书馆来处理或接收它们?也许有一个递归循环阻塞了线程。您应该对其进行调查并将其移至后台工作人员。
    • 消息来自 BluetoothLE,它是使用 WDK 蓝牙库实现的。所以我使用库来接收消息。没有可能阻塞线程的递归循环
    【解决方案2】:

    请参阅此thread 了解更多详情。 您还应该考虑到,对于 Windows 应用程序,您必须了解线程操作,因此您始终有一个 GUI 线程可能会受到调用流的影响。 因此,经验法则是了解线程在应用程序中的工作方式。
    一般来说,冻结窗口通常是GUI线程阻塞的标志。

    【讨论】:

    • 表单实际上是在代码前面创建的。在回调期间,我只使用 .show() 来显示它。我什至尝试创建表单的新实例,但没有帮助。在您链接的线程之后,我尝试创建一个新线程,以打开表单。这也没有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 2023-03-27
    • 2022-01-02
    • 2015-04-09
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多