これはかなり単純なことです。しかし、私はこれを理解することができませんでした。
/// This section is located in the InitializeComponent() method
/// form's class, i.e. partial class frmMain { .... }
this.bgw = new System.ComponentModel.BackgroundWorker();
this.bgw.WorkerReportsProgress = true;
this.bgw.DoWork += new System.ComponentModel.DoWorkEventHandler(this.bgw_DoWork);
this.bgw.ProgressChanged += new System.ComponentModel.ProgressChangedEventHandler(this.bgw_ProgressChanged);
/// This code is located in public partial class frmMain : Form { .... }
private void bgw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 1; i <= 100; i++)
{
Thread.Sleep(100); // Wait 100 milliseconds
//Console.WriteLine(i);
bgw.ReportProgress(i);
}
}
private void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
// Update status label
lblStatus.Text = e.ProgressPercentage.ToString();
}
// New code added to question after edit
public frmMain()
{
InitializeComponent();
bgw.RunWorkerAsync();
// some more stuff...
}
バックグラウンド ワーカーは正しく実行されています。ただし、進行状況を正しく更新していません。DoWork イベントのコメント行のコメントを外すと、ステータスが正しく更新されていることがわかります。ただし、ProgressChanged イベントは、メイン スレッドのタスク (重いデータベースの計算処理) が終了するまでトリガーされません。
これは .NET Framework 4 を使用しており、Windows フォーム アプリケーションです。
編集
コードの場所については、上記のコードのコメントを参照してください。
いくつかの詳細
実行中のコードには、データベースでの複数のクエリの実行が含まれます。そのコードを開示する自由はありません。そのコードがどのように実行されているかについては、別の開発者から .dll を渡され、データベースにアクセスするときだけ使用するように言われたので、実際にはわかりません....
編集
「some more stuff」セクションのコードは次のように移動されました
private void frmMain_Load(object sender, EventArgs e)
{
// some more stuff... aka run queries!
}