使用带有设计器对象的线程 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 视觉继承:Friend VS Protected