【问题标题】:how to run two process at a time in vb.net?如何在 vb.net 中一次运行两个进程?
【发布时间】:2015-03-13 00:43:02
【问题描述】:
 Imports System.Threading.Thread
 Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim i As Integer
    While i <= 10
        TextBox1.Text = i.ToString()
        TextBox1.Refresh()
        Sleep(1000)
        i = i + 1
    End While
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim lbl As Label
    Dim matches() As Control
    matches = Me.Controls.Find("Label" & TextBox1.Text, True)
    If matches.Length > 0 AndAlso TypeOf matches(0) Is Label Then
        lbl = DirectCast(matches(0), Label)
        lbl.BackColor = Color.Yellow
    End If
End Sub
End Class

如果我单击 button1,那么它会在一秒钟后在文本框中显示 1 到 10。它工作正常。当 textbox.text=2 时单击 button1 后,我想按下 button2。如果我按下按钮 2,那么它应该显示 label2.backcolor=yellow。标签号是 textbox.text。问题是:在button1中完成while循环后,只有我可以按下button2。完成 while 循环后,我们只得到黄色的 label10。解决方案:我想在结束while循环之前点击那个button2。请给出解决方案。其实我想在 textbox1.text 中显示哪个数字,该标签应该是黄色的。

【问题讨论】:

  • 您需要为 Button1.Click 处理程序启动一个新线程。您可以通过搜索 Google 了解如何做到这一点。

标签: vb.net


【解决方案1】:

Button1.Click 中的 While 循环阻塞了 UI 线程,因此阻塞了 Button2.Click 处理程序,直到 Button1.Click 完成。一种简单的解决方案是制作Button1.ClickAsync(假设.NET 4.5+)并改用Task.Delay(1000)

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim i As Integer
    While i <= 10
        TextBox1.Text = i.ToString()
        TextBox1.Refresh()
        'Sleep(1000)
        Await Task.Delay(1000)
        i = i + 1
    End While
End Sub

这将在Await 被点击时释放 UI 线程。

您也可以使用后台线程,但您必须确保您的 UI 更新发生在 UI 线程上。

【讨论】:

  • 如果我使用此代码 Await Task.Delay(1000) 它正在另一个程序中工作。在我当前的程序中它显示这样的错误。 (1.system action not defined.2.you can find all required by asyns modifier.你是不是在尝试错误的框架版本。
  • 你能帮我解决一下吗?
  • @BuvaneswariSekar 您当前应用程序的目标 .NET 框架版本是什么?它显示在项目属性页面的“应用程序”选项卡中。你正在使用什么版本的 Visual Studio。 .NET 4.5 / Visual Studio 2012 中添加了异步支持,但可以使用 .NET 4.0 / VS2012+ 以及一些额外的依赖项(来自 NuGet 的 BCL 库)。如果另一个应用程序正在运行,我猜你有 VS2012+,但可能针对不工作的应用程序的早期框架。
  • 是的,我正在使用 vs2012 .Net 4.5。我做了另一个应用程序(vs2012 .Net 4.5),但它的工作原理..当前程序也在同一个版本中。但它显示上述错误。解决方案是什么?还有其他办法吗?
  • 我正在使用 .Net 4.5 错误:mscorlib.dll 中出现“System.Reflection.TargetInvocationException”类型的未处理异常附加信息:调用目标引发了异常。
【解决方案2】:

警告:后面的代码很糟糕(但它有效!)

Private Sub Wait(ByVal time As Integer) 'in milliseconds
    Dim secs As Integer = Environment.TickCount
    While Environment.TickCount < secs + time
        Application.DoEvents()
    End While

End Sub
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
    Dim i As Integer
    While i <= 10
        Label1.Text = i.ToString()
        Label1.Refresh()
        Wait(1000)
        i = i + 1
    End While
End Sub
Private Sub Button2_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button2.Click
    Static toggle As Boolean
    If toggle Then
        Label1.BackColor = Color.Green
    Else
        Label1.BackColor = Color.Blue
    End If
    toggle = Not toggle
End Sub

【讨论】:

  • 它可能有效,但如果你必须打电话给.DoEvents(),那可能是错误的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
  • 2013-10-21
相关资源
最近更新 更多