BackgroundWorkerを使ったサンプルです。
テストコード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
private void BackgroundWorkerTest()
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(DoWork);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(RunWorkerCompleted);
// バックグラウンド操作の実行を開始します。
bw.RunWorkerAsync();
}
private void DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 10; i++)
{
System.Threading.Thread.Sleep(1000);
}
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Error != null)
{
// 非同期操作中にエラーが発生した場合は e.Error に例外を格納しています。
}
else if (e.Cancelled)
{
// 非同期操作中にキャンセルを行うとここに入ります。
}
MessageBox.Show("スレッド処理終了");
}
|
追記です。
DoWorkで例外が発生した場合、RunWorkerCompletedのe.Errorに例外の内容が入ります。
Microsoft Visual Studio上で動かしているとDoWork内で例外が発生し、
止まってしまいます。これはデバッグの例外の設定で処理を中断するにチェックが
付いているためです。チェックをはずすとRunWorkerCompletedまで処理が進みます。
それと、RunWorkerCompleted内はtry~catchで例外を処理したほうがよいです。
無ければ別スレッドなのでThreadExceptionEventHandlerでキャッチするかもしれないし
このイベントを登録してない場合は、
"アプリケーションのコンポーネントで、
ハンドルされてない例外が発生しました。~"となるからです。