2009-11-04 19 views
1

所以我有一個類在新的後臺工作人員開始一個新類,並且後臺工作人員使用progresschanged節傳回狀態消息。後臺工作者類和傳遞消息使用來自c中不同類的進度事件#

當我嘗試通過從一個單獨的類,我感到我正在使用對象定義之前錯誤輸入

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! 
} 

回答

1

感謝您的幫助,在這些答案和一個我發現我設法讓它工作,我缺少的行是: BackgroundWorker worker =(BackgroundWorker)sender;

,然後引用該工人對象與 worker.reportprogress(..)

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

完美,謝謝你們:)

0

ReportProgress所使用的後臺工作線程傳遞一個百分比值到Progress_Changed委託。這article向您展示了同步和異步的例子。

6

您需要調用ReportProgress與UserState如果你想要做這樣的事情:

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

然後您的通話將看起來是這樣的:

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

現在它看起來像您的e.UserState將爲空,並調用ToString()將導致空引用異常。
Here是UserState是文本的示例。

0

這是我解決方法(因爲我不想使用額外的事件處理程序)到目前爲止。那時我也不想理解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(); 
    }