后台工人类和使用来自c#中不同类的进度事件传递消息

时间:2009-11-04 16:47:59

标签: c# backgroundworker

所以我有一个类在新的后台工作程序中启动一个新类,后台工作程序使用progresschanged部分传回状态消息。

当我尝试并通过输入

来使用它时
classname.Dataworker.reportprogress(5)

从单独的类中我得到一个错误,我在定义之前使用了一个对象。

我发现的例子都使用了单个类和不同的函数。

这可能是一个愚蠢的错误,但我只是看不到它,谢谢你能给予的任何帮助!

我的代码的一般概述是:

//form class

public static BackgroundWorker bw = new BackgroundWorker();

onbuttonclick
{
        installer install = new installer();
        bw.WorkerReportsProgress = true;
        bw.WorkerSupportsCancellation = true;
        bw.DoWork += class2.aFunction;
        bw.ProgressChanged += new ProgressChangedEventHandler(mainForm_InstallerEvent);
        bw.RunWorkerAsync();
}

private void mainForm_InstallerEvent(object sender, ProgressChangedEventArgs e)
{

        lbl.Text = e.UserState.ToString();
}

//// class2后台工人类

aFunction
{
        InstallerForm.bw.ReportProgress(5); //errors on this!
}

4 个答案:

答案 0 :(得分:6)

如果您想要执行以下操作,则需要使用UserState调用ReportProgress

lbl.Text = e.UserState.ToString();

然后你的电话会是这样的:

aFunction
{
        InstallerForm.bw.ReportProgress(5, "5% Complete");
}

现在看起来你的e.UserState将为null,并且调用ToString()将导致空引用异常。
Here是UserState是文本的示例。

答案 1 :(得分:1)

感谢您的帮助,在我找到的答案和答案之间我已经设法让它工作了,我错过的一行是:     BackgroundWorker worker =(BackgroundWorker)sender;

然后引用该worker对象     worker.reportprogress(..)

我觉得有用的指南是:http://www.nerdparadise.com/tech/coding/csharp/backgroundworker/

完美,谢谢你们:)

答案 2 :(得分:0)

后台工作线程使用ReportProgress将百分比值传递给Progress_Changed委托。这个article显示了同步和异步的示例。

答案 3 :(得分:0)

到目前为止,这是我的 lazy 解决方法(因为我不想使用额外的事件处理程序)。那时我也不想理解userstate;)所以我使用了包含特定长操作的所有警报/消息的列表。消息字符串保存在应用程序内强大的资源存储库App.Properties.Settings中。由于ReportProgress采用整数,因此我将ReportProgress中的列表索引发送到Progress_Changed

例如: 在do_work中调用了以下方法。

 private void LongOperation()
 {
        try
        {
          //the operation
          if (success){
             //write a message to a status label
             bgWorker.ReportProgress(1);
          }
          else{
             //write a message to a status label
             bgWorker.ReportProgress(2); 
          }              
        }
        catch(){...}
  }

  public void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs p)
  {
      int lstIndex = p.ProgressPercentage;
      lblStatus.Text = mssglist[lstIndex].ToString(); 
  }