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

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

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

Re[11]: WebClientインスタンスのプーリングについて


(過去ログ 10 を表示中)

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

■1704 / inTopicNo.1)  WebClientインスタンスのプーリングについて
  
□投稿者/ Hirotow (42回)-(2007/03/03(Sat) 14:42:13)
Hirotow さんの Web サイト

分類:[C# (Windows)] 

現在C#を用いてダウンロード支援ツールの開発を行っています。

このツールは、

・アイテムオブジェクト
 ・ダウンロードの設定および状態
 ・これらを表示するためのListItemオブジェクト
 ・動的に割り当てられるWebClientインスタンス
・マネージャオブジェクト。
 ・アイテムオブジェクトのコレクション
 ・WebClientインスタンス

によって構成されており、メインフォームに設置されたタイマーによりマネージャオブジェクト内のアイテムオブジェクトにマネージャオブジェクトのWebClientインスタンスを割り当てダウンロードを行う機構になっています。

しかしながらこの構造では制限が多いため(単一のリストしか持つことができず、また同時にひとつしかダウンロードを行えない)、複数のマネージャオブジェクトが共通のプールからWebClientオブジェクトを取得しこれをアイテムオブジェクトに割り当てられる構造にしたいと考えています。
また、全体および各マネージャに割り当て可能なWebClientの数(すなわち同時接続数)はユーザーが任意のタイミングで変更可能なものとします(Irvineの同時接続数制限のような感じです)。

私の現在の知識ではこの実装方法がわからないのでご教授いただけると幸いです。
よろしくお願いします。
引用返信 編集キー/
■1710 / inTopicNo.2)  Re[1]: WebClientインスタンスのプーリングについて
□投稿者/ aoa (11回)-(2007/03/03(Sat) 21:10:47)
『増補改訂版Java言語で学ぶデザインパターン入門マルチスレッド編』
http://www.hyuki.com/dp/dp2.html
を読むといいと思います。
特に8章の「Worker Thread」がそのまま使える気がします。
引用返信 編集キー/
■1712 / inTopicNo.3)  Re[1]: WebClientインスタンスのプーリングについて
□投稿者/ 渋木宏明(ひどり) (141回)-(2007/03/03(Sat) 21:42:15)
渋木宏明(ひどり) さんの Web サイト
No1704 (Hirotow さん) に返信
> 同時にひとつしかダウンロードを行えない

WebClient.DownloadXXXAsync() を使えば、同時並行に複数のダウンロードを実行することが出来ます。

引用返信 編集キー/
■1713 / inTopicNo.4)  Re[2]: WebClientインスタンスのプーリングについて
□投稿者/ Hirotow (45回)-(2007/03/03(Sat) 22:37:58)
Hirotow さんの Web サイト
質問がわかりにくかったみたいですね。
すみません。

Windows.Formsなので当然非同期は使っています(^^;
そういうことではなく、プログラム全体で同時接続数の管理も兼ねて安全にWebClientを使いまわしたいのです。

ソリューションを貼り付けるので質問文の補助にしてください。
http://hcm.wankuma.com/data/cvd20070303a.cab

引用返信 編集キー/
■1714 / inTopicNo.5)  Re[3]: WebClientインスタンスのプーリングについて
□投稿者/ 渋木宏明(ひどり) (142回)-(2007/03/03(Sat) 23:02:12)
渋木宏明(ひどり) さんの Web サイト
> Windows.Formsなので当然非同期は使っています(^^;

なら、後は適当にプーリングの仕組みを自作すればいいだけでは?

引用返信 編集キー/
■1716 / inTopicNo.6)  Re[4]: WebClientインスタンスのプーリングについて
□投稿者/ Hirotow (46回)-(2007/03/03(Sat) 23:20:40)
Hirotow さんの Web サイト
No1714 (渋木宏明(ひどり) さん) に返信
>>Windows.Formsなので当然非同期は使っています(^^;
>
> なら、後は適当にプーリングの仕組みを自作すればいいだけでは?
>
がんばってみます。
解決済み
引用返信 編集キー/
■1717 / inTopicNo.7)  Re[5]: WebClientインスタンスのプーリングについて
□投稿者/ なちゃ (25回)-(2007/03/04(Sun) 00:31:48)
WebClientってプーリングしなきゃならないようなクラスでしたっけ?
いや試してないのでどの程度差があるかは分かってないんですが…

引用返信 編集キー/
■1720 / inTopicNo.8)  Re[6]: WebClientインスタンスのプーリングについて
□投稿者/ 渋木宏明(ひどり) (143回)-(2007/03/04(Sun) 06:14:36)
渋木宏明(ひどり) さんの Web サイト
No1717 (なちゃ さん) に返信
> WebClientってプーリングしなきゃならないようなクラスでしたっけ?

複数のダウンロードを同時並行に扱うなら、そして、動的にダウンロード数の管理を行いたいなら、プーリングの機構が必要じゃないですか?

1個の WebClient で、ダウンロードが完了する前に何度も DownloadXXXAsync() 呼び出しが行えるようなつくりになっているなら話は別ですが。

ちなみに、ここで言うプーリングは SqlConnection のような接続のプールではなく、スレッドプールのような「WebClient のインスタンス」のプールの話だと思います。

引用返信 編集キー/
■1723 / inTopicNo.9)  Re[7]: WebClientインスタンスのプーリングについて
□投稿者/ Hirotow (47回)-(2007/03/04(Sun) 10:57:30)
Hirotow さんの Web サイト
> ちなみに、ここで言うプーリングは SqlConnection のような接続のプールではなく、スレッドプールのような「WebClient のインスタンス」のプールの話だと思います。

そういうことです。

# ただ、結構仕様は変わりそうです。
引用返信 編集キー/
■1724 / inTopicNo.10)  Re[8]: WebClientインスタンスのプーリングについて
□投稿者/ 渋木宏明(ひどり) (144回)-(2007/03/04(Sun) 11:18:59)
渋木宏明(ひどり) さんの Web サイト
>>ちなみに、ここで言うプーリングは SqlConnection のような接続のプールではなく、スレッドプールのような「WebClient のインスタンス」のプールの話だと思います。
>
> そういうことです。

であれば、プールの実装自体は簡単なもので十分なはずです。
List<WebClient> を lock で保護しつつ使う、とか。


引用返信 編集キー/
■1726 / inTopicNo.11)  Re[9]: WebClientインスタンスのプーリングについて
□投稿者/ aoa (13回)-(2007/03/04(Sun) 13:42:06)
2007/03/04(Sun) 14:11:24 編集(投稿者)

WebClientをプーリングするのではなく、
スレッドをプーリングしてその中でWebClientのインスタンスをnewすればいいと思ったのですが、
非同期のDownloadXXXAsync()を使う、ということでしたね。
勘違いしていました。すいません。

引用返信 編集キー/
■1771 / inTopicNo.12)  Re[10]: WebClientインスタンスのプーリングについて
□投稿者/ 渋木宏明(ひどり) (146回)-(2007/03/05(Mon) 23:13:27)
渋木宏明(ひどり) さんの Web サイト
遅レスですが。。。

> 2007/03/04(Sun) 14:11:24 編集(投稿者)
>
> WebClientをプーリングするのではなく、
> スレッドをプーリングしてその中でWebClientのインスタンスをnewすればいいと思ったのですが、
> 非同期のDownloadXXXAsync()を使う、ということでしたね。
> 勘違いしていました。すいません。

非同期処理(=DownloadXXXAsync())を採用することによって、ダウンロード処理に関しては、コードで明示的にスレッドを起こす必要はなくなります。

非同期リクエストを行わなくても、どうも WebClient は内部で勝手にスレッドを起こしている気配も感じられます。
また、WebClient によるセッションにはランタイムでその最大数に制限を課していたはずです。

なので、ダウンロード処理と、ダウンロードしたコンテンツの処理を分離することで、スレッドの無駄遣いを抑えたり、セッション数の制限からくる無駄なスレッドのブロックを避けられる可能性があります。


引用返信 編集キー/
■1773 / inTopicNo.13)  Re[11]: WebClientインスタンスのプーリングについて
□投稿者/ Hirotow (57回)-(2007/03/05(Mon) 23:39:04)
Hirotow さんの Web サイト
> なので、ダウンロード処理と、ダウンロードしたコンテンツの処理を分離することで、スレッドの無駄遣いを抑えたり、セッション数の制限からくる無駄なスレッドのブロックを避けられる可能性があります。

分離。
面倒なのでコンポジションは好みではないのですが、正論的にはそうすべきですね。

ほかには、ダウンロードはたぶんリソースを消費しやすい処理だと思うので、使いまわすかその都度破棄するかしなければいけないと。
あとリジュームなどの割と高度な機能を組み込むとなるとWebClientでは力不足なので(できないことはなさそうだが)、WebRequest/WebResponseでの独自実装(ほとんどどぼんさんとこの流用ですが)も作りたいところです。

# 花粉症で頭が回らない(泣)
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -