C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: スレッドの破棄の仕方について


(過去ログ 22 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■9857 / inTopicNo.1)  スレッドの破棄の仕方について
  
□投稿者/ あら (38回)-(2007/11/06(Tue) 11:03:11)

分類:[C#] 

お世話になっております。

スレッドの破棄の仕方について質問があります。
スレッドをいくつも作成し、終了時に作成したスレッドをスレッドの終了を待たずに
全て破棄したいと思っています。

下記のようにしたところスレッドを1つ作成した場合は終了時にスレッドの終了を待た
ずにアプリケーションは終了するのですが、スレッドを2つ以上作成した場合はスレッ
ドが終了するまでアプリケーションが終了しません。
作成されているスレッドを全て削除するにはどのように記述すればよいのでしょうか?

ご教授、アドバイス等宜しくお願いします。
(C# VS2005)
--------------------------------------------------
【Form1】
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private ClassThread classThread = new ClassThread();
        private void btn_ThreadStart_Click(object sender, EventArgs e)
        {
            classThread.ControlProcess();
        }

        private void btn_AppClose_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            classThread.KillThread();
        }
    }

【スレッドのクラス】
    public delegate void ExampleCallback();

    public class ClassThread
    {
        Thread extThread = null;

        //スレッド開始
        public void ControlProcess()
        {
            TestThread r = new TestThread(
                new ExampleCallback(ResultCallback)
            );

            extThread = new Thread(new ParameterizedThreadStart(r.ProcessWorker));
            extThread.Start();
        }

        //スレッドの結果を受け取る
        public static void ResultCallback()
        {
            Console.WriteLine("###ResultCallback");
        }

        //スレッドを破棄する
        public void KillThread()
        {
            extThread.Abort();
        }
    }

    public class TestThread
    {
        private ExampleCallback callback;

        public TestThread(ExampleCallback callbackDelegate)
        {
            callback = callbackDelegate;
        }

        public void ProcessWorker(object obj)
        {
            Thread.Sleep(60000);
            callback();
        }

    }

引用返信 編集キー/
■9859 / inTopicNo.2)  Re[1]: スレッドの破棄の仕方について
□投稿者/ Hongliang (209回)-(2007/11/06(Tue) 11:10:42)
Hongliang さんの Web サイト
アプリケーション終了時でいいなら IsBackground で十分のように思えますが。
引用返信 編集キー/
■9863 / inTopicNo.3)  Re[2]: スレッドの破棄の仕方について
□投稿者/ 渋木宏明(ひどり) (513回)-(2007/11/06(Tue) 12:10:44)
渋木宏明(ひどり) さんの Web サイト
> アプリケーション終了時でいいなら IsBackground で十分のように思えますが。

とか、非同期デリゲートやスレッドプール使う、でもよさそうですね。

引用返信 編集キー/
■9864 / inTopicNo.4)  Re[3]: スレッドの破棄の仕方について
□投稿者/ 渋木宏明(ひどり) (514回)-(2007/11/06(Tue) 12:13:04)
渋木宏明(ひどり) さんの Web サイト
将来的に任意のタイミングでスレッドを終了させたい、という展望があるなら、WinForms アプリのようなんで、BackgroundWorker コンポーネントを使ってみるとか。

引用返信 編集キー/
■9865 / inTopicNo.5)  Re[2]: スレッドの破棄の仕方について
□投稿者/ まどか (395回)-(2007/11/06(Tue) 12:13:50)
Abort()はその意味(異常による強制終了)でのみ使うようにしましょう。
普通はシグナルや内部フラグを立てるようなメソッドの公開などで、プロシージャの終端に飛ばし自然に終了するようにします。
引用返信 編集キー/
■9911 / inTopicNo.6)  Re[4]: スレッドの破棄の仕方について
□投稿者/ あら (39回)-(2007/11/07(Wed) 08:39:04)
返信ありがとうございます。

IsBackgroundプロパティをtrueにして、解決しました。

ありがとうございます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -