【问题标题】:Issue with backgroundworker in c#c#中的backgroundworker问题
【发布时间】:2013-04-15 21:39:46
【问题描述】:

目前我有一个图片框,上面有两个项目,一个处理 gif 文件和一个标签。现在,当调用 backgroundworker 时,我已经为所有三个项目(图片框、处理 gif、标签)调用了 BringToFront()

下面是我的后台工作人员代码 sn-p

private void buttonUpload_Click(object sender, EventArgs e)
{
   LoadFile(pdfFullPath);
   bgwLoadFile.RunWorkerAsync(dummyPDFPath);
   pictureBox1.BringToFront();
   picLoading.BringToFront();
   label.BringToFront();
}

private void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e)
{       
    this.Invoke((MethodInvoker)delegate() {
        acrPDFViewer.LoadFile(e.Argument.ToString());
    });
}


private void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Cancelled == true)
    {
    }
    else if (e.Error != null)
    {
    }
    else
    {
        pictureBox1.SendToBack();
        picLoading.SendToBack();
        label.SendToBack();
    }
}

在执行时它没有显示这三个项目。

【问题讨论】:

  • 您是否收到一些异常或错误消息?
  • 我没有收到任何异常或错误..当我调试它时,它通过了所有步骤,但没有采取任何行动
  • 您确定您正在访问bgwLoadFile_RunWorkerCompleted 事件处理程序吗?您可能需要反复调用 Application.DoEvents() 以确保正确触发 RunWorkerCompleted 事件。
  • 这是您第三次问同样的问题:stackoverflow.com/questions/15152850/…stackoverflow.com/questions/15703045/… 如果您需要进一步的指导,请在您的问题中提供更多详细信息。

标签: c# backgroundworker


【解决方案1】:

这对我有用:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        UpdateControls(false);

        bgwLoadFile.DoWork += new DoWorkEventHandler(bgwLoadFile_DoWork);
        bgwLoadFile.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgwLoadFile_RunWorkerCompleted);
    }

    private void buttonUpload_Click(object sender, EventArgs e)
    {
        UpdateControls(true);
        bgwLoadFile.RunWorkerAsync();
    }

    void bgwLoadFile_DoWork(object sender, DoWorkEventArgs e)
    {
        //simulate work
        System.Threading.Thread.Sleep(2000);
    }

    void bgwLoadFile_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if(!e.Cancelled && e.Error == null)
            UpdateControls(false);
    }

    private void UpdateControls(bool isVisable)
    {
        if (isVisable)
        {
            pictureBox1.BringToFront();
            picLoading.BringToFront();
            label1.BringToFront();
        }
        else
        {
            pictureBox1.SendToBack();
            picLoading.SendToBack();
            label1.SendToBack();
        }
    }
}

如果您只想让这三个控件仅在后台工作程序处于活动状态时显示,您可以将UpdateControls()-方法更改为:

private void UpdateControls(bool isVisable)
{
    pictureBox1.Visible = isVisable;
    picLoading.Visible = isVisable;
    label1.Visible = isVisable;
}

【讨论】:

  • 在运行代码之前,通过在else 中添加断点来检查代码是否已执行。
  • 是的,它正在执行,但最初它无法显示图片框、标签、加载图像,尽管提供了 BringToFront()
  • @Ganeshja 更新了我的答案,看看吧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
相关资源
最近更新 更多