我正在研究一个应用程序,它可以从外部服务器获取并安装一堆更新,并且需要一些线程帮助。用户按照该过程:精简框架/线程 - 选择选项后,MessageBox显示在其他控件上
- 点击按钮
- 更新方法检查,返回计数。
- 如果大于0,则询问用户是否要使用MessageBox.Show()进行安装。
- 如果是,它会运行一个循环并在每个更新的run()方法上调用BeginInvoke()以在后台运行它。
- 我的更新类有用于更新进度条等
进度条的更新精细一些事件,但在MessageBox没有从画面,因为该更新循环后,右开始完全清除用户点击是(见下面的截图)。
- 我应该怎么做才能让消息框在更新循环开始之前即刻消失?
- 我应该使用线程而不是BeginInvoke()吗?
- 我应该在单独的线程上执行初始更新检查并从该线程调用MessageBox.Show()?
代码
// Button clicked event handler code...
DialogResult dlgRes = MessageBox.Show(
string.Format("There are {0} updates available.\n\nInstall these now?",
um2.Updates.Count), "Updates Available",
MessageBoxButtons.YesNo,
MessageBoxIcon.Question,
MessageBoxDefaultButton.Button2
);
if (dlgRes == DialogResult.Yes)
{
ProcessAllUpdates(um2);
}
// Processes a bunch of items in a loop
private void ProcessAllUpdates(UpdateManager2 um2)
{
for (int i = 0; i < um2.Updates.Count; i++)
{
Update2 update = um2.Updates[i];
ProcessSingleUpdate(update);
int percentComplete = Utilities.CalculatePercentCompleted(i, um2.Updates.Count);
UpdateOverallProgress(percentComplete);
}
}
// Process a single update with IAsyncResult
private void ProcessSingleUpdate(Update2 update)
{
update.Action.OnStart += Action_OnStart;
update.Action.OnProgress += Action_OnProgress;
update.Action.OnCompletion += Action_OnCompletion;
//synchronous
//update.Action.Run();
// async
IAsyncResult ar = this.BeginInvoke((MethodInvoker)delegate() { update.Action.Run(); });
}
截图