私は多くのクラスを持っています。通常、レコードセットをステップ実行し、Webサービスを呼び出すか、レコードごとに2つのクラスを呼び出します。倒立したバックグラウンドワーカー
これはすべてGUIスレッドで実行され、ペイントをハングします。最初の考えは、BackgroundWorkerを使用して素敵な進捗バーを実装し、エラーや完了などを処理することでした。
コードが画面に表示されるとすぐに、匂いがかかり始めました。私は、各クラスに多くのバックグラウンドワーカーを書いていました.bw_DoWorkメソッドの大部分のProcessRowsメソッドを繰り返し、より良い方法があるはずだと考えていました。おそらくすでに完了しているはずです。
バックグラウンドワーカーを分離するクラスのパターンや実装があるのですがibackgroundableなどのインターフェイスを実装するクラスが必要ですが、クラスはスタンドアロンで実行でき、インターフェイスを実装するために最小限の変更が必要です。
編集:@Henkによって要求された簡単な例:私が持っている
:
private void buttonUnlockCalls_Click(object sender, EventArgs e)
{
UnlockCalls unlockCalls = new UnlockCalls();
unlockCalls.MaxRowsToProcess = 1000;
int processedRows = unlockCalls.ProcessRows();
this.textProcessedRows.text = processedRows.ToString();
}
私は私がしたいと思う:
private void buttonUnlockCalls_Click(object sender, EventArgs e)
{
UnlockCalls unlockCalls = new UnlockCalls();
unlockCalls.MaxRowsToProcess = 1000;
PushToBackground pushToBackground = new PushToBackground(unlockCalls)
pushToBackground.GetReturnValue = pushToBackground_GetReturnValue;
pushToBackground.DoWork();
}
private void pushToBackground_GetReturnValue(object sender, EventArgs e)
{
int processedRows = e.processedRows;
this.textProcessedRows.text = processedRows.ToString();
}
私が先に行くとこれを行うが、ドン可能性があり再考したくない。
私がまたは「はい、ジョーはその(ここ)の優れた実装をした」の線に沿って
小さな(簡略化した)例を追加することはできますか? –
この例では、UnlockCallsがSQL文で最大1000行を取得し、Webサービスでそれぞれのロックを解除し、処理した行の数を返します。 私はまた、キャンセル/進捗機能をpushToBackgroundクラスで実装/使用したいと思っています。 –