【发布时间】:2011-05-09 19:34:48
【问题描述】:
我目前正在处理我的个人等待对话框实现,它支持任务进度更新和任务取消。 ATM 是这样的:
public partial class WaitDialog : Form
{
WaitDialog()
{
InitializeComponent();
}
public static WaitDialog Instance
{
get { return WaitDialogCreator.uniqueInstance; }
}
public DialogResult ShowDialog(Form owner, string message)
{
Instance.lblWaitMessage.Text = message;
return Instance.ShowDialog(owner);
}
public DialogResult ShowDialog(Form owner, BackgroundWorker worker)
{
...
}
public DialogResult ShowDialog(Form owner, string message, BackgroundWorker worker)
{
...
}
private class WaitDialogCreator
{
static WaitDialogCreator() { }
internal static readonly WaitDialog uniqueInstance = new WaitDialog();
}
}
在我的 ShowDialog() 方法中,我可以传递一个工作对象参数,以便我可以设置一些取决于其属性的属性/处理程序,例如使用的进度条的类型(如果报告进度更改则为选取框,否则为连续)、取消任务的可能性(根据 WorkerSupportsCancellation 属性)等。方法如下所示:
public DialogResult ShowDialog(Form owner, BackgroundWorker worker)
{
if (worker == null)
{
throw new ArgumentNullException("worker", "A non-null worker must be provided.");
}
else
{
Instance.btnCancel.Enabled = worker.WorkerSupportsCancellation;
//This handler close the dialog
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(onWorkerWorkComplete);
if (worker.WorkerReportsProgress)
{
Instance.pbProgress.Style = ProgressBarStyle.Continuous;
//Update the progress bar
worker.ProgressChanged += new ProgressChangedEventHandler(onWorkerProgressChanged);
}
if (worker.WorkerSupportsCancellation)
{
Instance.btnCancel.Click += (sender, e) => { worker.CancelAsync(); };
}
}
return Instance.ShowDialog(owner);
}
我会以这种方式通过父表单上的控制器访问等待对话框:
public Controller(Form window)
{
this.window = window;
this.waitDialog = WaitDialog.Instance;
}
...
public void ShowWaitDialog(BackgroundWorker worker)
{
if (worker == null)
{
this.ShowWaitDialog();
}
else
{
window.BeginInvoke((MethodInvoker)delegate() { waitDialog.ShowDialog(window, worker); });
}
}
也许这是一个非常愚蠢的问题,但这里是:在这种情况下应用(像我一样)单例模式是否正确,或者我应该选择正常的实例创建,因为 WaitDialog 类结束通常会处理更多比其生命周期中的 BackGroundWorker?
让我想知道的是,每次我在对 ShowDialog(Form, BackGroundWorker) 的调用中传递一个新的 BackGroundWorker 时,我都可以(而且我将)修改 WaitDialog 的单个实例属性。 根据模式,这是正确的行为吗?我可以采取其他途径来更好地实施吗?我愿意接受任何建议。
【问题讨论】:
标签: c# winforms singleton backgroundworker