C#Toolstrip的进度条和Label未从跨线程操作更新

时间:2017-05-09 13:05:19

标签: c# winforms .net-3.5 toolstripstatuslabel

出于某种原因,ToolStrip的ProgressBar和Label不会从其他线程更新。经过大量阅读后,我想出了这个,但仍然无法正常工作(但是按钮没问题,但状态栏上没有。)

    public void GdmReaderMessageEvent(object sender, GdmMessagesEventArgs e)
    {
        Console.WriteLine(e.Message);

        // error or abort
        if (e.Message.StartsWith("Error:") || e.Message.StartsWith("Aborted"))
        {

            // cross thread crap
            if (pb.GetCurrentParent().InvokeRequired)
                pb.GetCurrentParent().Invoke(new MethodInvoker(delegate { pb.Visible = false; }));

            if (lblStatus.GetCurrentParent().InvokeRequired)
                lblStatus.GetCurrentParent().Invoke(new MethodInvoker(delegate { lblStatus.Text = e.Message; }));

            btnImport.Invoke(new MethodInvoker(delegate { btnImport.Text = "Import"; }));

            //lblStatus.Text = e.Message;
            //btnImport.Text = "Import";
            //pb.Visible = false;
        }
    }

编辑,现在所有功能,但这只是BGW线程的回调,我认为它已经很明显了。如果我只使用它:

        lblStatus.Text = e.Message;  // this is a Label inside Status
        btnImport.Text = "Import";   // this is just a button on Form
        pb.Visible = false;          // this is a Progress Bar inside Status    

将抛出交叉线程错误。这就是我使用Invoke()的原因。 现在按钮可以更新,但状态栏中的所有控件都没有。

希望现在更清楚了。

我使用.NET 3.5,VS2008,Winforms。 任何解决方案?

1 个答案:

答案 0 :(得分:0)

好的,我找到了。 @Fixation,感谢指导我与"这个" (我的意思是表格本身)。我试图使用无效的控制调用。

此外,这篇文章很有用 unable to update progress bar with threading in C#

        this.BeginInvoke((Action)(() => pb.Visible = false));
        this.BeginInvoke((Action)(() => lblStatus.Text = e.Message));

非常完美,谢谢。