これは、別のフォームからダイアログを更新するためのフォローアップの質問です (コードとスクリーンショットはそこにあります)。
GUI がハングする問題を解決するために、次の 2 つの推奨事項を受け取りました。
使用する
Application.DoEvents()
を使って
BackgroundWorker
DoEvents() アプローチは機能しますが、使用すべきではないことが指摘されています。実際、GUI は正しく更新されますが、短時間応答しません。
だからこそ、私は BackgroundWorker を使いたいと思っていて、それを読んでいます。
ただし、サンプルコードの4つのラベルを個別に更新するために使用できるように実装する方法がわかりません。プログラムが 1 つのジョブを正常に終了したときに、進行状況を表示 (および 4 つのダイアログ ラベルを更新) したいと考えています。ただし、 BackgroundWorker には 1 つしかDoWork()
ありません。の を使用してe.Argument
、DoWorkEventArgs
さまざまな更新方法を区別しようとしましたが、失敗しました。
public partial class BackgroundWorkerImportStatusDialog : Form
{
private BackgroundWorker dialogWorker = new BackgroundWorker();
private string path;
private string clientName;
public BackgroundWorkerImportStatusDialog()
{
InitializeComponent();
}
public void updateFileStatus(string path)
{
this.path = path;
dialogWorker = new BackgroundWorker();
dialogWorker.DoWork += new DoWorkEventHandler(updateLabels);
dialogWorker.RunWorkerAsync(UpdateComponent.FileStatus);
}
public void updatePrintStatus()
{
dialogWorker = new BackgroundWorker();
dialogWorker.DoWork += new DoWorkEventHandler(updateLabels);
dialogWorker.RunWorkerAsync(UpdateComponent.PrintStatus);
}
public void updateImportStatus(string clientName)
{
this.clientName = clientName;
dialogWorker = new BackgroundWorker();
dialogWorker.DoWork += new DoWorkEventHandler(updateLabels);
dialogWorker.RunWorkerAsync(UpdateComponent.ImportStatus);
}
public void updateArchiveStatus()
{
dialogWorker = new BackgroundWorker();
dialogWorker.DoWork += new DoWorkEventHandler(updateLabels);
dialogWorker.RunWorkerAsync(UpdateComponent.ArchiveStatus);
}
private void updateLabels(object sender, DoWorkEventArgs e)
{
MessageBox.Show(e.Argument.ToString());
if ((UpdateComponent) e.Argument == UpdateComponent.FileStatus)
{
t_filename.Text = path;
}
if ((UpdateComponent) e.Argument == UpdateComponent.PrintStatus)
{
t_printed.Text = "sent to printer";
}
if ((UpdateComponent) e.Argument == UpdateComponent.ImportStatus)
{
t_client.Text = clientName;
}
if ((UpdateComponent) e.Argument == UpdateComponent.ArchiveStatus)
{
t_archived.Text = "archived";
}
}
public enum UpdateComponent { FileStatus, PrintStatus, ImportStatus, ArchiveStatus}
そして、この非常に些細なダイアログに 4 つの BackgroundWorker を用意することが解決策になるとは想像できません。