高見知英のかいはつにっし(β)

高見知英のアプリケーション開発日誌 のほか、地域活動などの活動報告ブログ。

あんまり難しくないスレッド化

以前(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();

などとやるといつまでも待ち続けてしまいますので、ご注意を(ちょっとはまりました)(^_^;