3

GUI クラスにバックグラウンド ワーカーがいます。

private void bw_DoWork(object sender, DoWorkEventArgs e)
{
    ProgressClass obj = new ProgressClass();
    Importer tradeImporter = e.Argument as Importer;
    BackgroundWorker worker = sender as BackgroundWorker;
    List<TradeUploadInfo> list = obj.AllocateTrades2(tradeImporter, false);
    e.Result = list; //Passes the list for processing
}

インポーターは私自身のクラスです。これで、AllocateTrades2メソッド内ですべての処理が完了しました。

私の質問は、 bw をパラメーターとして渡さずに、別のクラスにあるメソッドbw.ProgressReport内でどのように実行するのですか?AllocateTrades2

誰かがイベントでそれを行う方法を説明してくれたら素晴らしいと思いますが、別のエレガントな方法があれば. 私はアイデアを受け入れます。

4

3 に答える 3

5

知る必要がある以上のものを公開しないように、BGW 全体を渡したくない場合 (当然のことですが)、1 つのオプションは、ReportProgress呼び出しを割り当てるデリゲートを渡すことです。

の署名を次のように調整AllocateTrades2します。

public List<TradeUploadInfo> AllocateTrades2(
    Importer importer, bool flag, Action<int> reportProgress)

reportProgressそのメソッド内から必要に応じてデリゲートを呼び出します。

次に、呼び出しを次のAllocateTrades2ように調整します。

obj.AllocateTrades2(tradeImporter, false,
     progress => worker.ReportProgress(progress));
于 2013-05-21T19:22:26.527 に答える
1

がバックグラウンド ワーカーのコンテキストで実行されるという事実を考えると、AllocateTrades2発生するイベントもそのコンテキストで実行されます。

したがって、必要なことはProgressClass、たとえばNotifyProgressに新しいイベントを追加し、それをバックグラウンド ワーカーがあるクラスにバインドすることだけです。

そう:

 //In class ProgressClass. 
 public event EventHandler<ProgressClassEventArgs> NotifyProgress = (s, e) => {};

そして次:

 private void bw_DoWork(object sender, DoWorkEventArgs e)
 {
     ProgressClass obj = new ProgressClass();

     //Here you hook up the event
     obj.NotifyProgress += this.OnProgressChanged;

     Importer tradeImporter = e.Argument as Importer;
     BackgroundWorker worker = sender as BackgroundWorker;
     List<TradeUploadInfo> list = obj.AllocateTrades2(tradeImporter, false);
     e.Result = list; //Passes the list for processing
 }

イベント ハンドラーは次のようになります。

private void OnProgressChanged(object sender, ProgressClassEventArgs e) 
{
   worker.ReportProgress(e.Progress);
}

ワーカーをこのクラスのメンバーとして持つことができる (またはすでに持っている) ので、問題ありません。

ProgressClassEventArgs(サブクラス)を定義し、この場合は int 型EventArgsのプロパティを追加して、 args と一致させる必要があります。ProgressReportProgress

于 2013-05-21T19:22:23.857 に答える