VB.NET后台工作60秒超时

时间:2012-12-21 10:05:26

标签: vb.net backgroundworker

在我的应用程序启动期间,我正在进行长时间的数据库升级。 在开始之前,我会显示一个包含进度条的表单,以便用户知道某些事情正在发生并且他应该等待。

为了不阻止进度条重绘,我在后台工作程序中进行数据库升级。

代码如下所示:

            frmMain_Load(...)

            Dim wait As New frmWait
            wait.Show()

            Dim bw As New frmBWRebuildUserData
            bw.Start()
            Do While Not bw.Done
                System.Threading.Thread.Sleep(100)
            Loop

            'Okay, db update was done, now continue and show the main app window

我的frmBWRebuildUserData如下所示:

Public Class frmBWRebuildUserData

Private m_bDone As Boolean

Public ReadOnly Property Done() As Boolean

    Get
        Return m_bDone
    End Get

End Property

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    modAppDB.RebuildUserDB()

End Sub
Public Sub Start()

    Me.BackgroundWorker1.RunWorkerAsync()

End Sub

Private Sub BackgroundWorker1_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

    m_bDone = True

End Sub
End Class

但是60秒后,VB.NET告诉我60秒后没有消息(我猜你知道这个错误)。

但是由于后台工作人员的目的是为了这个目的,我认为我在这里做了一些非常错误的事情,但我无法弄清楚是什么。

另外,我的进度条没有重绘。

请帮帮忙吗? 非常感谢你!

2 个答案:

答案 0 :(得分:1)

有几件事。

后台工作者没有60秒的内置超时。所以它应该是你代码中的东西。

为什么使用backgroundWorker然后在代码中引入睡眠周期?应该使用backgroundworker来释放用户界面等待长时间操作的结束。

当被要求向用户界面元素报告其进度时,后台工作者需要这样的事情(抱歉是C#,但我认为你可以明白这一点)

 backgroundworker.ProgressChanged += backgroundworker_ProgressChanged;
 backgroundworker.WorkerReportsProgress = true;

在这种情况下,您的modAppDB.RebuildUserDB()需要致电

 backgroundworker.ReportProgress(percentComplete);

对于要与进度条进行通信的每个步骤,当然,您需要在显示进度条的表单中拦截ReportProgress调用触发的事件

private void backgroundworker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = (e.ProgressPercentage.ToString() + "%");
}

答案 1 :(得分:1)

Backgroundworker主要适用于在DoWork中有循环的任务,它允许您在循环中执行一些UI反馈。如果您的DoWork只调用另一个命令,它将等待此命令完成,并且此时不执行任何操作。除此之外,使用BGW仍然允许主线程处理其消息而不会被阻止,所以我认为在这里使用它仍然是完全正确的。
除此之外,您的backgroundworker1未被声明,正如史蒂夫指出的那样,您的Start() - Method至少需要第一行:
Addhandler Backgroundworker1.DoWork, AddressOf BackgroundWorker1_DoWork。这会在调用RunworkerAsync时触发该功能 有关线程通信的基本示例(以及与之相关的基本问题),请查看此问题并回答:
Multithreading for a progressbar and code locations (vb.net)?
我不知道60秒的问题。