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

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

提前致谢!

【问题讨论】:

    标签: vb.net multithreading performance antivirus


    【解决方案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 参数的方法或函数,以共享您的控件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2013-03-13
      • 1970-01-01
      • 2014-11-16
      • 2017-03-05
      相关资源
      最近更新 更多