以前(id:TakamiChie:20070107:1168133425)も書いたとおり、ダウンロード処理のスレッド化をしました。.NET Compact Framework2.0ではThread.Abort()メソッドがサポートされているので、ダウンロード中の中止などといった処理も実装可能です。
一応下記ページも参考にやってみましたが、あんまり難しくないんですね。
(英語ページ)
C#2.0では匿名メソッドがサポートされているので、以下のような感じでも記述可能。
dlthread = new Thread(delegate() { try { this.Invoke(new EventHandler(delegate { // 内部でGUIフォームオブジェクトをさわる this.Recieving = true; })); // ダウンロード using(Stream stream = getNetworkStream(SelectedSong.Url)) streamSaveToFile(stream, Constant.DLMIDIFile); ・ ・ ・ } finally { this.Invoke(new EventHandler(delegate { this.Recieving = false; statusBar.Text = ""; })); } }); dlthread.Start();
Invokeの引数はdelegateオブジェクトなので、Delegate型の適当なクラスとして、newしてやってください。
なお、Thread.Abort()を使用すると、リファレンスにもあるとおり「ThreadAbortException は、キャッチできても、catch ブロックの末尾でもう一度自動的に発生」します。
.NET Compact Framework2.0ではThread.ResetAbort()がサポートされていないため、この例外に対応した動作を行わないようにしてください。
他のサイトにあるように
dlthread.Abort(); dlthread.Join();
などとやるといつまでも待ち続けてしまいますので、ご注意を(ちょっとはまりました)(^_^;