使用带有设计器对象的线程 vb.net

Posted

技术标签:

【中文标题】使用带有设计器对象的线程 vb.net【英文标题】:Using a thread with designer objects vb.net 【发布时间】:2014-08-01 06:59:28 【问题描述】:

我有一个大问题。我目前正在设计一款防病毒软件,并且进展顺利。但是让所有扫描引擎在同一个线程上运行,即主要的,是导致应用程序加载滞后,并在进程中变得无响应。我已经尝试实现多线程来提高我的应用程序的速度和整体性能。但是,每次我尝试时,我都会得到交叉线程的错误,即我无法使用表单设计器的进度条、按钮和标签等。我只想知道为什么会抛出这个错误,以及如何解决它。

提前致谢!

【问题讨论】:

【参考方案1】:

使用 InvokeRequired 检查您从哪个线程调用,如果您不在 UI 线程中,则 InvokeRequired 为 True,因此您可以从 UI 线程调用委托以安全地更改 Control:

    Public Sub SetText(ByVal text As String)
        If (Me.InvokeRequired) Then
            'Invoke a delegate from the UI Thread
            Me.Invoke(DirectCast(Sub() Label1.Text = "Test", MethodInvoker))
        Else
            Button1.Text = text
        End If
    End Sub

不使用 Invoke 方法从创建控件的线程以外的线程调用控件是不安全的。看看这个例子:http://msdn.microsoft.com/library/ms171728%28v=vs.110%29.aspx

【讨论】:

我不明白invoke方法是如何工作的,请您提供一个有效的VB.NET代码示例并更详细地告诉我它是如何工作的 Me.Invoke(DirectCast(Sub() Label1.Text = "Test", MethodInvoker)) "Label1.Text = "Test"" 代表的地方,你也可以使用函数/方法。 感谢代码实际上帮助了很多!现在我可以让我的 Anti-Virus 多线程,让它运行得更快、更可靠!谢谢!【参考方案2】:

将您的表单属性:CheckForIllegalCrossThreadCalls 设置为 false。你不会再有错误了。

此外,您必须表明,您在线程和表单控件之间获得了引用。否则,您更改线程处理窗口的控件(您看不到)。

尝试编写带有By Ref 参数的方法或函数,以共享您的控件。

【讨论】:

以上是关于使用带有设计器对象的线程 vb.net的主要内容,如果未能解决你的问题,请参考以下文章

表单视图设计器无法在 Visual Studio 2019 中使用 c# .NET Core 3.1 [重复]

VB.net 如何设计多线程运行

面向对象5-7次作业总结

VB.NET 视觉继承:Friend VS Protected

无法使用带有 Visual Studio 2010 的 Windows 窗体恢复设计器视图窗口

vb.net中怎么可以让窗体全屏显示?