【问题标题】:VB.net Cross-ThreadVB.net 跨线程
【发布时间】:2010-02-10 20:42:19
【问题描述】:

我有一个需要执行的 cmd 命令,当命令启动时,它开始填充进度条。当 cmd 命令完成后,进度条需要填充到 100。

这是我使用的代码,但是当progressbar.Value = 100 出现时它给了我一个错误。

Public Class Form1
    Dim teller As Integer

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerProgressbar.Tick
    teller += 1
    ProgressBar1.Value = teller

    If ProgressBar1.Value = ProgressBar1.Maximum Then
        TimerProgressbar.Stop()
    End If
End Sub

这是应用程序崩溃的另一个私有子中的拖曳命令

ProgressBar1.Value = 100
    TimerProgressbar.Stop()

当我调试它并尝试它时,它崩溃了

ProgressBar1.Value = 100

但是当我在 Windows 7 下构建它时,它运行良好而没有崩溃,但是一些人报告我它在 Windows xp 系统上崩溃了。

VB 给了我一个关于 Cross Thread 的建议,但我不知道如何让它与它一起工作。

【问题讨论】:

  • 您显示的不是“跨线程” - Windows.Forms.Timer 的 Tick 事件在 UI 线程上。您实际收到的错误是什么?
  • 忘记了一些事情,我用 ProgressBar1.Value = 100 TimerProgressbar.Stop() 外的按钮启动进度条我确实收到了 IllegalOperationException 错误。带有指向交叉线程页面的链接。 Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button.Click TimerProgressbar.Start() End Sub
  • 顺便说一句,它给出了 IllegalOperationException

标签: vb.net progress-bar multithreading


【解决方案1】:

您只能从创建该窗口的线程访问(有一个例外)窗口(或任何与窗口相关的)属性和方法。

但 WinForms 包含对此的支持,通过 Invoke(和 BeginInvoke)方法执行跨线程调用,并使用 InvokeRequired 属性。

如果InvokeRequired为真,那么你需要使用Invoke来跨线程。为此,将您的代码包装在自己的方法中操作控件,并直接调用或通过Invoke 调用。 (要异步执行跨线程操作,请改用BeginInvoke。)类似:

Private Sub IncrementProgress()
    teller += 1
    ProgressBar1.Value = teller

    If ProgressBar1.Value = ProgressBar1.Maximum Then
        TimerProgressbar.Stop()
    End If
End Sub      

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TimerProgressbar.Tick
  if ProgressBar1.RequiredInvoke Then
    ProgressBar1.Invoke(IncrementProgress)
  Else
    IncrementProgress
  End If
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多