【发布时间】:2011-10-03 21:50:20
【问题描述】:
我有两种形式,一种是主形式,另一种是作为模式对话框弹出的。从主窗体中产生的进程中,我想动态更新模态对话框上的文本。这是我所拥有的:
在主窗体中,我这样做:
// show the wait modal
var modal = new WaitDialog { Owner = this };
// thread the packaging
var thread = new Thread(() => Packager.PackageUpdates(clients, version, modal));
thread.Start();
// hopefully it worked ...
if (modal.ShowDialog() != DialogResult.OK)
{
throw new Exception("Something failed, miserably.");
}
PackageUpdates 方法采用模态对话框,并执行以下操作:
// quick update and sleep for a sec ...
modal.SetWaitLabelText("Downloading update package...");
Thread.Sleep(2000);
modal.SetWaitLabelText("Re-packaging update...");
为了线程安全,我在模态对话框中执行此操作:
public void SetWaitLabelText(string text)
{
if (lblWaitMessage.InvokeRequired)
{
Invoke(new Action<string>(SetWaitLabelText), text);
}
else
{
lblWaitMessage.Text = text;
}
}
一切都很好......大部分时间。模态框每弹出三到四次,我就会在 lblWaitMessage.Text = text; 上得到一个异常,并且它没有调用命令。
我是否在此设置中遗漏了什么?
【问题讨论】:
-
你启动线程太快了。等待 modal.Load 事件。
-
就像 Hans Passant 说的,我不确定 thread.Start() 是否可以在 modal.ShowDialog() 之前安全使用。究竟是什么异常?
-
您得到的确切异常是什么。正如 Hans 所说,很可能在表单完全构建之前,线程正在执行对
SetWaitLabelText的第一次调用。 -
自从我发布此消息后,我再也没有收到异常。我会继续尝试并发布异常情况,并尝试 Hans 的解决方案。