这是从另一个表单更新对话框的后续问题(可以在此处找到代码和屏幕截图)
为了解决我的 GUI 挂起问题,我收到了 2 条建议:
使用
Application.DoEvents()
用一个
BackgroundWorker
DoEvents() 方法有效,但有人指出我不应该使用它。事实上,我注意到 GUI 更新正确,但在短时间内没有响应。
这就是我想使用 BackgroundWorker 并阅读它的原因。
不过,我不明白我将如何实现它,以便它可以用于分别更新示例代码中的 4 个标签。当程序成功完成一项工作时,我想显示进度(并更新 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 是解决方案。