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

処理の途中で進行を表示する

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

はじめまして。

いくつかのファイルを順次加工していく処理を考えています。その進行状況を表示する方法を実装しようとしているのですが、詰まっています。

ページにあるボタンを押すと処理が開始され、現在処理中のファイルがテキストボックスに表示され、処理が次のファイルに移ると、テキストボックスの表示も変わるようなイメージです。

javascriptの__doPostBack()でポストバックを起こし、Page_Loadの中でファイルを処理し、処理し終えたら次のファイル名をテキストボックスに表示し、OnUnloadで再度ポストバックさせる、ようなことを考えていたのですが、うまくいかないです。

お力添え頂けたら助かります。
また、上のような方法以外で出来るのでしたら、教えていただけると嬉しいです。

宜しくお願いします。

ムック
■No29974に返信(ムックさんの記事)
OnUnloadはサーバー側のイベントハンドラですか? クライアント側にもonunloadイベン
トがありますのでどちらのことをいわれているのかちょっとわからないのですが、サー
バー側のUnloadイベントは、サーバーがレスポンスをクライアントに返す前に発生するも
のです。ムックさんのいわれているのがサーバー側のUnloadイベントのハンドラであれば、
Unloadイベントのハンドラでポストバックできたとしても、レスポンスがクライアントに
送信されませんので、テキストボックスの表示を変えることはできないと思われます。

ポストバックが行なわれるとページ全体が再描画されます。テキストボックスの表示を変
えるためにページ全体が再描画されるのはコストパフォーマンスが悪いです。サーバーに
リクエストを送信しつつページの再描画を回避できるものとしてクライアントコールバッ
クを利用する方法とWebサービスを利用する方法があります。クライアントコールバック
のリクエストで送信される情報はポストバックのときと同じものです。ページの情報がま
るっとまるごとサーバーに送られます。サーバーの処理の進捗を確認するのみであれば
ページの情報を送る必要はありませんのでパフォーマンス的にはページの情報もできれば
送られないほうがよいのかなと思われます。そのように考えるとWebサービスを利用する
のがよいのではないでしょうか。Webサービスを利用する方法ではページの再描画を回避
して、さらに軽量なリクエストを送信することができます。

ScriptManagerコントロールを使用してページメソッドをWebサービスとして公開するのはこんな感じです。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
    </asp:ScriptManager>
    <input id="Button1" type="button" value="button" onclick="button1Click();" />
    <input id="Text1" type="text" />
    </form>
    <script type="text/javascript">
        function button1Click() {
            callService();
        }
        function callService() {
            PageMethods.TestMethod(testMethodCallback);
        }
        function testMethodCallback(arg) {
            var args = eval(arg);
            Text1Update(args[1]);
            switch (args[0]) {
                case "continue":
                    callService();
                    break;
                case "end":
                    break;
            }
        }
        function Text1Update(text) {
            var textbox = $get("Text1");
            textbox.value = text;
        }
    </script>
</body>
</html>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services;
namespace WebApplication1 {
  public partial class _Default : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {

    }

    [WebMethod()]
    public static string[] TestMethod() {
      string state = ""; // "continue" または "end"
      string filename = "";
      // 処理をごにょごにょ
      return new string[] { state, filename };
    }
  }
}
もりおさん

お返事ありがとうございます。連絡が遅れ、申し訳ありません。

JavascriptからWebMethodを使う方法があるとは知りませんでした。お恥ずかしい。
サンプルのスキームでうまく動きましたので、これを利用させていただきます。

ありがとうございました。

ムック

■No30027に返信(もりおさんの記事)
> ■No29974に返信(ムックさんの記事)
> OnUnloadはサーバー側のイベントハンドラですか? クライアント側にもonunloadイベン
> トがありますのでどちらのことをいわれているのかちょっとわからないのですが、サー
> バー側のUnloadイベントは、サーバーがレスポンスをクライアントに返す前に発生するも
> のです。ムックさんのいわれているのがサーバー側のUnloadイベントのハンドラであれば、
> Unloadイベントのハンドラでポストバックできたとしても、レスポンスがクライアントに
> 送信されませんので、テキストボックスの表示を変えることはできないと思われます。
>
> ポストバックが行なわれるとページ全体が再描画されます。テキストボックスの表示を変
> えるためにページ全体が再描画されるのはコストパフォーマンスが悪いです。サーバーに
> リクエストを送信しつつページの再描画を回避できるものとしてクライアントコールバッ
> クを利用する方法とWebサービスを利用する方法があります。クライアントコールバック
> のリクエストで送信される情報はポストバックのときと同じものです。ページの情報がま
> るっとまるごとサーバーに送られます。サーバーの処理の進捗を確認するのみであれば
> ページの情報を送る必要はありませんのでパフォーマンス的にはページの情報もできれば
> 送られないほうがよいのかなと思われます。そのように考えるとWebサービスを利用する
> のがよいのではないでしょうか。Webサービスを利用する方法ではページの再描画を回避
> して、さらに軽量なリクエストを送信することができます。
>
> ScriptManagerコントロールを使用してページメソッドをWebサービスとして公開するのはこんな感じです。
> <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
> <html xmlns="http://www.w3.org/1999/xhtml">
> <head runat="server">
> <title></title>
> </head>
> <body>
> <form id="form1" runat="server">
> <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="True">
> </asp:ScriptManager>
> <input id="Button1" type="button" value="button" onclick="button1Click();" />
> <input id="Text1" type="text" />
> </form>
> <script type="text/javascript">
> function button1Click() {
> callService();
> }
> function callService() {
> PageMethods.TestMethod(testMethodCallback);
> }
> function testMethodCallback(arg) {
> var args = eval(arg);
> Text1Update(args[1]);
> switch (args[0]) {
> case "continue":
> callService();
> break;
> case "end":
> break;
> }
> }
> function Text1Update(text) {
> var textbox = $get("Text1");
> textbox.value = text;
> }
> </script>
> </body>
> </html>
>
> using System;
> using System.Collections.Generic;
> using System.Linq;
> using System.Web;
> using System.Web.UI;
> using System.Web.UI.WebControls;
> using System.Web.Services;
> namespace WebApplication1 {
> public partial class _Default : System.Web.UI.Page {
> protected void Page_Load(object sender, EventArgs e) {
>
> }
>
> [WebMethod()]
> public static string[] TestMethod() {
> string state = ""; // "continue" または "end"
> string filename = "";
> // 処理をごにょごにょ
> return new string[] { state, filename };
> }
> }
> }
解決済み!

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