状态标签未在后台工作进度更新上更新

时间:2013-01-24 05:23:07

标签: c# winforms multithreading

我以前见过类似的问题,但似乎没有一个适合我的情况。 我有一个Windows窗体,窗体有一个后台工作者,工作者支持更新。 我有一个状态条标签。

单击按钮启动后台工作程序,单击该按钮后,后台工作程序启动正常。每次迭代我都会进行更新,将字符串作为用户状态发送。  如果我使用该字符串来更新表单的标题,标题会随着进程的运行而更改,并按预期工作...但是,如果我尝试使用该字符串来更新状态条标签的值,那么标签没有得到更新。

我正在一个单独的线程上进行工作,然后是UI线程,而且我无论如何都没有阻止UI线程,这可以通过按预期观看标题更新来证明。但是状态条标签未更新。

显然,状态条标签不是System.Windows.Controls的子类,但是我试图使状态条标签无效,我试图使状态条标签所在的状态条无效并刷新,但是在背景工作正常时,我无法获取状态条标签来更改文本。

以下是Progress Changed事件的代码

    void workerThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        //_statusCurrentActivityLBL.Text = e.UserState.ToString();
        String s = e.UserState.ToString();
        Text = s;
        _statusCurrentActivityLBL.Text = s;
        _statusCurrentActivityLBL.Invalidate();

        statusStrip1.Invalidate();
        statusStrip1.Refresh();
    }

正如我所说,Windows表单文本更改正确,但状态标签没有。

UPDATE @Richard Schneider  Label的Class名称是ToolStripStatusLabel它似乎没有Refresh()成员。

更新2 @Chibueze Opata   代码运行没有错误。标题文本将更改,如果我更新简单标签上的文本控件标签更新(这是我目前的工作)。问题是状态条上的ToolStripStatusLabel没有更新。

1 个答案:

答案 0 :(得分:-3)

尝试使用Application.DoEvents() 在更新标签之前

试试这种方式

    Delegate Sub SetLabelText(ByVal [Label] As Label, ByVal [text] As String)

    Private Sub SetStatus(ByVal [Label] As Label, ByVal [text] As String)
    ' InvokeRequired required compares the thread ID of the calling thread to the thread ID of the creating thread.
    ' If these threads are different, it returns true.
    If [Label].InvokeRequired Then
        Dim MyDelegate As New SetLabelText(AddressOf SetStatus)
        Me.Invoke(MyDelegate, New Object() {[Label], [text]})
    Else
        [Label].Text = [text]
    End If
End Sub

像这样调用这个函数

    SetStatus(lblStatus,"Status message")