外部サーバーから一連の更新を取得してインストールするアプリに取り組んでおり、スレッド化の助けが必要です。ユーザーは次のプロセスに従います。
- ボタンのクリック
- メソッドは更新をチェックし、count が返されます。
- 0 より大きい場合は、MessageBox.Show() を使用してインストールするかどうかをユーザーに尋ねます。
- はいの場合、ループを実行し、各更新の run() メソッドで BeginInvoke() を呼び出して、バックグラウンドで実行します。
- 私の更新クラスには、進行状況バーなどを更新するために使用されるいくつかのイベントがあります。
進行状況バーの更新は問題ありませんが、ユーザーが [はい] をクリックした直後に更新ループが開始されるため、MessageBox は画面から完全に消去されません (下のスクリーンショットを参照)。
- 更新ループが始まる前にメッセージボックスを即座に非表示にするにはどうすればよいですか?
- BeginInvoke() の代わりに Threads を使用する必要がありますか?
- 別のスレッドで最初の更新チェックを行い、そのスレッドから 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(); });
}
スクリーンショット