DOBON.NET DOBON.NETプログラミング掲示板過去ログ

BegenInvokeで実行した非同期スレッドの停止について

環境/言語:[C#]
分類:[.NET]

いつも参考にさせて頂いています。

現在とある処理を複数のスレッドで実行しています。

for()
{
Dele = new ProcDele(Thread);
IAsyncResult ar = Dele.BeginInvoke();
}

このBeginInvoke()で実行されたスレッドを、メインスレッドの
ボタンクリックで停止させようとしています。
このような事は可能なのでしょうか。

よろしくお願いします。
やりたい事を実現する方法はいくらでもありますが、
スレッドの扱いなどにあまり慣れていないならBackgroundWorkerを使うことをおすすめします。
■No26920に返信(なちゃさんの記事)
> やりたい事を実現する方法はいくらでもありますが、
> スレッドの扱いなどにあまり慣れていないならBackgroundWorkerを使うことをおすすめします。

ありがとうございます。

1つスレッド実行する時に使用した事はあったのですが、
複数起動する必要がありBackgroundWorkerを使用しませんでした。
http://xptn.dtiblog.com/blog-entry-69.html

方法が複数あるようなので、少し調べて考えてみます。
ちょっと誤解があるかも知れませんが、BackgroundWorkerは別に、
デザイナから貼り付けて一つだけで使わなければならないわけではありません。
ただのクラスとしてでも普通に使えます。

また、複数のスレッドが使えないというのも、一つのインスタンスではというだけで、
必要な数インスタンスを作れば問題なく同時に使えます。

まあどういう方式を使うかは自由でやりやすいようにやればいいのですが、
結局BackgroundWorkerがやっているようなことを自分で実装する事になります。
キャンセルしたいだけくらいならまあ単純なもので済みますが。
BackgroundWorkerを使わない方式なら、例えば
フォームのメンバにキャンセルされたかどうかを示すフラグ変数を追加し
ボタンがクリックされたらフラグセットするようにして
スレッド側では適時フラグを確認してセットされてたら終了するようにします。
基本的に終了はスレッド側で自発的に行うようにします。

フラグはプロパティにして読み書き時にロックするようにしましょう。
ロックしない手もありますがスレッドに慣れてないなら止めておきましょう。

あと、フラグの確認は適時と書きましたが、極端に小さなループ内では
チェックし続けるのはよくありません。
目安としては1〜数十ミリ秒に1回くらいチェックされれば十分です。
■No26923に返信(なちゃさんの記事)
> BackgroundWorkerを使わない方式なら、例えば
> フォームのメンバにキャンセルされたかどうかを示すフラグ変数を追加し
> ボタンがクリックされたらフラグセットするようにして
> スレッド側では適時フラグを確認してセットされてたら終了するようにします。
> 基本的に終了はスレッド側で自発的に行うようにします。
>
> フラグはプロパティにして読み書き時にロックするようにしましょう。
> ロックしない手もありますがスレッドに慣れてないなら止めておきましょう。
>
> あと、フラグの確認は適時と書きましたが、極端に小さなループ内では
> チェックし続けるのはよくありません。
> 目安としては1〜数十ミリ秒に1回くらいチェックされれば十分です。

ありがとうございます。

子スレッドからデリゲート使ってメインスレッドのフラグを参照するようにしました。
無事実装できました。

ありがとうございました!
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板