みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

BackgroundWorkerについて(C#)

C#でBackgroundWorkerを使ったプログラムを試しています。
Windows Form上にButtonとProgressBarを設置して以下のプログラムを
動作させると、プログレスバーが終了するまえに”終了”が出てしまいますが
これはどうしてでしょうか?
よろしくお願いいたします。

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
button1.Enabled = false;
Random rand = new Random();
BackgroundWorker bgWorker = new BackgroundWorker();
bgWorker.DoWork += ((sender2, e2) =>
{
for (int i = 0; i < 10; i++)
{
Thread.Sleep((int)(rand.NextDouble() * 500));
bgWorker.ReportProgress((i + 1) * 10);
}
});
bgWorker.RunWorkerCompleted += ((sender2, e2) =>
{
button1.Enabled = true;
bgWorker.Dispose();
MessageBox.Show("終了");
});
bgWorker.ProgressChanged += ((sender2, e2) =>
{
progressBar1.Value = e2.ProgressPercentage;
});
bgWorker.WorkerReportsProgress = true;
bgWorker.RunWorkerAsync();
}
}
}

投稿日時 - 2013-05-28 17:10:10

QNo.8108982

困ってます

質問者が選んだベストアンサー

>プログレスバーが終了するまえに”終了”が出てしまいますが
>これはどうしてでしょうか?

単純にタイミングの問題なんじゃないですかねぇ…。
>progressBar1.Value = e2.ProgressPercentage;
でプログレスバーの値が書き換わりますが、再描画の指示がメッセージキューに積まれます。
で、その再描画を処理する前にRunWorkerCompletedが処理されてしまった。
ということかと。

実行している環境のスペック次第でそこら辺は変わるかも知れません。
# というかこちらではそんな事になりませんでしたし……。

MessageBox.Show()の前にprogressBar1.Update()とか入れてみたらどうなりますかね?
# まあ、このタイミングで再描画強制できるかどうかは不明ですが。
# button1.Enabled = true;でのボタンの再描画は走っているみたいですからイケますかねぇ…。

あと……テストだからいいかも知れませんが、DoWorkでResult設定した方がいいんじゃないですかね。

投稿日時 - 2013-05-29 13:23:22

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問