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

非同期デリゲートのスレッド破棄

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

いつもお世話になっております。
非同期デリゲートで処理が終了したら
スレッドがすぐには破棄されないのでしょうか。

外部プロセスからProcess.Threads.Countを使って
スレッド数を監視したのですが、
button1_Clickでスレッド数が1増加しましたが、
1減るのはMyCallbackを通ってから5分ぐらい
経ってからでした。終了後すぐにスレッドを破棄させることは可能でしょうか?

Threadクラスを用いたマニュアルスレッドならすぐに破棄されるようです。
以下がコードです。よろしくお願いします。


private delegate void ThreadMethodDelegate(); //
private static ThreadMethodDelegate threadMethodDelegate; //

private void button1_Click(object sender, System.EventArgs e)
{
threadMethodDelegate = new ThreadMethodDelegate(MyMethod); //

     // デリゲートによるスレッド処理呼び出し
AsyncCallback callBack = new AsyncCallback( MyCallback );
threadMethodDelegate.BeginInvoke( callBack, DateTime.Now ); //
}
// 別スレッドで呼び出されるメソッド
private void MyMethod()
{
Console.WriteLine( "Method" );
}
// スレッド処理終了後に呼び出されるコールバック・メソッド
private void MyCallback( IAsyncResult ar ) //
{
Console.WriteLine( "Callback" );
}
ukishimaと申します。

EndInvoke()が呼ばれてないのが気になりますね^^

> EndInvoke()が呼ばれてないのが気になりますね^^

レスありがとうございました。
MyCallBackでEndInvokeを呼びましたが結果は同じでした。
> 非同期デリゲートで処理が終了したら
> スレッドがすぐには破棄されないのでしょうか。

確信はありませんが、そういうものなのかもしれません。

スレッドの起動にもそれなりのコストがかかるので、次の非同期デリゲートの実行に備えてスレッドをプールしているのかもしれません。

仮にそうだとして、それで何か(プロセスが終了しないなど)具体的に困っていることがあるのでしょうか?
> スレッドの起動にもそれなりのコストがかかるので、次の非同期デリゲートの実行に備えてスレッドをプールしているのかもしれません。

ありがとうございます。
そうですね、確かに次の実行に備えているというのはあるかもしれません。

困っているのは以下の通りです。
リモーティング通信を行っているのですが、クライアント側で
非同期デリゲートを利用してメッセージの送受信を行っています。
スレッドがまだ残っている状態でリモーティングを切断すると、
次に接続するのにスレッドが破棄されてからでないと
接続できないんです。
スレッドが破棄されるまでポートが占有されたままに
なっているためだと思われます。
いつでも接続切断をトグルできるようにしたいのですが・・・。
> スレッドがまだ残っている状態でリモーティングを切断すると、
> 次に接続するのにスレッドが破棄されてからでないと
> 接続できないんです。
> スレッドが破棄されるまでポートが占有されたままに
> なっているためだと思われます。
> いつでも接続切断をトグルできるようにしたいのですが・・・。

非同期デリゲートで渡したメソッドの実行が終われば、スレッド自体が存命であっても、メソッド内で生成されたオブジェクトは参照を失ってGCの対象になるはずなんですが。。。

例えば、非同期デリゲートで渡したメソッドの末端で、そのメソドッド内で使用したすべてのオブジェクト参照に null を代入すると変化はあるでしょうか?

また、同様にメソッド末端で GC.Collect() を実行するとどうなるでしょう?
2005/08/17(Wed) 16:48:20 編集(投稿者)


> 非同期デリゲートで渡したメソッドの実行が終われば、スレッド自体が存命であっても、メソッド内で生成されたオブジェクトは参照を失ってGCの対象になるはずなんですが。。。

申し訳ありません。
おっしゃる通りスレッドの問題ではなかったです。
送受信それぞれに対して非同期デリゲートを使っているのですが、
送信スレッドだけならば全く問題無しでした。
(スレッドが生きていても切断・接続できます)
一回でも受信すると同じ問題が起こります。
(切断すると数分の間、接続できない)

受信のやりかたは、クライアントから接続時に
ブロードキャスト用のデリゲートをサーバーに登録しています。
接続時にデリゲートを +=、
切断時に -= しています。

サーバーにデリゲートを登録しない場合は問題なしです。
サーバーにデリゲートを登録しても一回も受信しない場合は問題無しです。
一回でも受信すると、受信用の非同期デリゲートを
起動してもしなくも問題は起こります。

クライアント側での非同期デリゲートは関係ないようですので、
スレッドのメソッドでGC.Collectなどでは変化なしでした。

すみません、もう少し考えてみます。

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