2009-07-27 7 views
3

私は長時間実行しているサーバーサイドプロセスを持っています(do/whileループの一部としてWebサービス経由でデータを取得します)。ループを通過するたびに、ステータスメッセージをクライアント上の更新パネルのラベルコントロールにプッシュしたいと思っています。長時間実行されているサーバープロセスがクライアント側のラベルを更新しています。 AJAX ASP.Net

コードビハインドのラベルに値を割り当ててから、毎分更新パネルを更新するためにタイマーコントロールを使用してみました。しかし、それは動作していないようです。

アイデアや提案はありますか?

TIA

答えて

1

私は、セッション変数を介して、おそらくあなたのサーバ側プロセスからステータスを読み込むページへの単純なjQuery.getコールを使用してお勧めします。その後、クライアントは要求を行います。この失敗は、サーバー側がクライアント側にコンテンツをプッシュしようとしている(更新を強制的に)サーバー側から実行しようとしていることです。長時間実行されているプロセスが引き続き実行されるためです。私の知る限りでは、httpを介してあなたの気まぐれを押すことはできません...リクエストはブラウザによって行われなければなりません!

+0

これは私がダウンしているルートに似ています。しかし、この問題は、長時間実行されているプロセス(ループ)がonclickイベントによってトリガされたときに、コードの背後にループが働いているため、ステータスの要求に対処できないという事実に関連しているようです。 私はjQueryに慣れていないので、私はそのオプションを検討します。私はまた、スレッドを探索し、並列スレッドを生成しなければならないかもしれません。 入力いただきありがとうございます。 –

0

少し異なる方法が考えられます。

まず、タイマーを削除します。次に、Response.Writeを使用して、処理中の場所を出力します。 I.E .:処理アイテム番号234

Response.writeの後にResponse.Flushを実行します。これにより、サーバーは現在キャッシュされているレスポンスオブジェクトをブラウザに書き込むよう強制します。

+0

これは、テキストを応答ストリームにプッシュします。私は、この情報がどこにどのように表示されるのかをもう少しコントロールする必要があります。 (あなたが知っているように見えます) ありがとう –

+0

いくつかのプロセスは10分以上というように非常に長く実行されています。その応答チャネルを不必要に開いたままにすると、サーバーリソースが消費されます。また、response.writeアプローチは非常に脆弱です。ブラウザが閉じていると、チャネルは壊れて更新を再開することができません。クライアント側の要求アプローチをセッション変数と組み合わせて使用​​すると、ブラウザが再起動されてページが再び訪問されたときに更新を再開できます。 – CobaltBlue

1

あなたのコメントに正しいトラックがあります。別のスレッドで作業を開始し、セッション/キャッシュを通してその進行状況を追跡することを検討してください。さらに一歩進んで、タスクとそのすべてのスレッドロジックをLongRunningTaskクラスにカプセル化し、ポーリングコードで((LongRunningTask)Cache["MyLongRunningTask"]).TaskStatusかその行に沿った何かをチェックすることもできます(もちろん正確なコードを使用してステータスを取得しないでください=))

0

サーバー・プロセスの書き込みがあり、現在の状況とページ上の要素を更新する

<script> 
    /* jquery to update an element on the client page */ 
</script> 

をフラッシュします。これをスペースで埋めなければならないかもしれないので、正しくフラッシュされるのに十分なバイト数(例えば、1000バイト)を加えます。この後も出ることができます。あなたのクライアントには、スクリプトタグの内容が非常に冗長であり、多くの更新がある場合は、この問題に少し問題があるかもしれません。 .. 10パーセントごとに)、そうでなければ、最終出力のファイルサイズは、高いメガバイトの範囲にある可能性があります。

関連する問題