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

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

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

Re[3]: Webメソッドの進捗を取得したい


(過去ログ 84 を表示中)

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

■49865 / inTopicNo.1)  Webメソッドの進捗を取得したい
  
□投稿者/ やぶ (1回)-(2010/05/21(Fri) 10:05:02)

分類:[C#] 

開発環境:WindowsXP、VisualStudio2008 Professional Edition

C#のASP.NETのWebサービス(.NET Framework 2.0)で処理に時間のかかる
Webメソッドで進捗を取得したいと考えております。
どのようなニュアンスかというと、

[WebMethod]
public void Sample()
{
Thread.Sleep(1000);
Thread.Sleep(1000);
Thread.Sleep(1000);
}

上記のようなWebメソッドを実装する際に、それぞれの処理の間に
クライアントに進捗状態を返したいと考えております。
BackgroundWorkerにおけるProgressChangedイベントとReportProgressメソッドのような
イメージなのですが、Webメソッドの場合どのように実装すればよいのでしょうか。
よろしくお願いいたします。
引用返信 編集キー/
■49873 / inTopicNo.2)  Re[1]: Webメソッドの進捗を取得したい
□投稿者/ 渋木宏明(ひどり) (1331回)-(2010/05/21(Fri) 11:04:58)
渋木宏明(ひどり) さんの Web サイト
どれくらい真面目に実装したいですか?

Web サービスの枠組みには、クライアント側でサーバ処理の進捗を検知するような仕組みは含まれていません。

なので、サーバ上での処理の進捗をクライアント側で把握するには、その仕組(結局は、クライアントからサーバに対してポーリングをかけることになります)自体を自分で用意しなくてはなりません。
これは、結構手間がかかります。

もし、もっと単純に、Web サービスのメソッド呼び出し中にクライアントをブロックしたくないだけであれば、Web メソッドの呼び出しを非同期にするなど、比較的安価な手法で実現出来ます。

引用返信 編集キー/
■49905 / inTopicNo.3)  Re[1]: Webメソッドの進捗を取得したい
□投稿者/ たか (43回)-(2010/05/21(Fri) 21:44:01)
スマートではないですが以下のようにわければ 実装も楽だし目的のこともほぼ実装できるのではないですか?

1.目的のWEBメソッドを非同期で呼び出し
2.目的のWEBメソッド内で進捗状況を適宜ファイルやDBに吐き出す
3.上記のCSVorDBから進捗情報を適宜取得するWEBメソッドを作成し1秒に1回呼び出し進捗状況を取得する


厳密な進捗は把握できませんが 1にそこそこ時間がかかる処理であればそれなりの進捗の様子は取得できると思います。


複数の呼び出しの可能性もあるから 1の呼び出し時に固有キーを渡してやり 2,3の処理でその固有キーごとに
値を書き込み、取得できるような工夫とか必要ですが
この方法なら1時間あれば実装できると思いますがいかがでしょう?



いかがでしょう?
No49865 (やぶ さん) に返信
> 開発環境:WindowsXP、VisualStudio2008 Professional Edition
>
> C#のASP.NETのWebサービス(.NET Framework 2.0)で処理に時間のかかる
> Webメソッドで進捗を取得したいと考えております。
> どのようなニュアンスかというと、
>
> [WebMethod]
> public void Sample()
> {
> Thread.Sleep(1000);
> Thread.Sleep(1000);
> Thread.Sleep(1000);
> }
>
> 上記のようなWebメソッドを実装する際に、それぞれの処理の間に
> クライアントに進捗状態を返したいと考えております。
> BackgroundWorkerにおけるProgressChangedイベントとReportProgressメソッドのような
> イメージなのですが、Webメソッドの場合どのように実装すればよいのでしょうか。
> よろしくお願いいたします。
引用返信 編集キー/
■49913 / inTopicNo.4)  Re[2]: Webメソッドの進捗を取得したい
□投稿者/ 渋木宏明(ひどり) (1335回)-(2010/05/22(Sat) 00:11:42)
渋木宏明(ひどり) さんの Web サイト
2010/05/22(Sat) 00:15:28 編集(投稿者)

> スマートではないですが以下のようにわければ 実装も楽だし目的のこともほぼ実装できるのではないですか?
>
> 1.目的のWEBメソッドを非同期で呼び出し

このメソッド呼び出しに、あまりにも時間がかかるようだと、HTTP タイムアウトしてしまいますよね。

まぁ、その場合は毛化的に、真面目に進捗を得るのと同じで

・サーバに対して処理要求を投げつけ、結果取得のためのトークン的なものを受け取る。
・サーバに対して処理結果、もしくは進捗の取得を行う。未完なら然るべき時間待機して、再試行。

のようなシナリオに分割するしか無いです。
引用返信 編集キー/
■49915 / inTopicNo.5)  Re[1]: Webメソッドの進捗を取得したい
□投稿者/ Jitta on the way (641回)-(2010/05/22(Sat) 09:26:50)
No49865 (やぶ さん) に返信
http://blogs.wankuma.com/jitta/archive/2005/11/18/19448.aspx
こんな感じ
引用返信 編集キー/
■49919 / inTopicNo.6)  Re[2]: Webメソッドの進捗を取得したい
□投稿者/ 渋木宏明(ひどり) (1336回)-(2010/05/22(Sat) 11:38:23)
渋木宏明(ひどり) さんの Web サイト
2010/05/22(Sat) 12:07:59 編集(投稿者)
2010/05/22(Sat) 12:06:26 編集(投稿者)

> こんな感じ

ASP.NET でワーカースレッドを使うのは、あまりオススメ出来ません。

ASP.NET アプリケーションをホストするワーカープロセスは、突然、再起動される可能性があります。
ワーカープロセスが再起動する時には、処理途中のスレッドも破棄されてしまいます。

また、Web ファームを構築する時なんかにもスケールしづらい、という欠点もあります。


引用返信 編集キー/
■49957 / inTopicNo.7)  Re[3]: Webメソッドの進捗を取得したい
□投稿者/ やぶ (2回)-(2010/05/25(Tue) 14:34:59)
皆様ありがとうございます。

>>Web サービスの枠組みには、クライアント側でサーバ処理の進捗を検知するような仕組みは含まれていません。
このような仕組みがあるのかなと思っていたので、とても勉強になりました。

現在はクライアントでWebメソッドの呼び出しを非同期で行っておりますが、
「処理中:○○%」のような表示を出したかったものですから。

比較的簡単に実現できれば、取り込みたいと考えておりましたが、
DBに進捗結果を出力するとかの話になると、少々面倒なことになりそうですので、
もう少し、提示いただいたアイディアを考えていきたいと思います。

とりあえず検討を進めるということで解決済みとさせていただきます。
ご意見をいただきましてありがとうございました。




解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -