- PR -

APS.NET 1.1にて2つの画面の処理を並列で行ないたい。

投稿者投稿内容
カタナ
大ベテラン
会議室デビュー日: 2006/05/25
投稿数: 110
投稿日時: 2007-02-21 10:07
いつもお世話になっております。現在、APS.NET 1.1(VB)で開発を行なっています。
その際、処理が遅い画面にて、「実行中です」と表示したいという要望が顧客よりあり、次の様な処理を考えていたのですが、2の別画面が3の処理が終了するまで起動しないため、うまくいきません。
▼処理内容
1.ボタンを押す。
2.window.openで別画面起動(別画面は<meta http-equiv="Refresh" content="1;URL=xxxxx.aspx">にてリフレッシュ )
3.サーバ側は続けて、処理を行なう。
▼サンプルソース
コード:
Public Class testtesttest
    Inherits System.Web.UI.Page
    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        ' ポップアップ画面起動
        Me.Button1.Attributes.Add("onclick", "wn=window.open('popup/popup_wait.aspx');wn.focus();")
    End Sub
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            'ループを行い遅い処理を演出
            For i As Int32 = 1 To 9999
                For j As Int32 = 1 To 9999
                    For k As Int32 = 1 To 9999
                    Next k
                Next j
            Next i
            Me.Label1.Text = "処理終了"
        End Try
    End Sub
End Class


▼処理の流れは下記の過去レスの内容と全く同じです。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=28672&forum=7

すこし気になるのが、上記レスでjittaさんが「ASP.NET の構成ファイルで、プロジェクトがデバッグとなっていると、並列処理がされないと、どこかに書いてあった気がするんだけれど、探せない。。。」 という記述があることです。

1.並列処理は構成ファイルを変更しないとできないのでしょうか?またその場合どの値を変更すれば並列処理ができるのでしょうか?
2.上記のサンプルのような処理はできないのでしょうか?
よろしくご教授お願い致します。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-02-21 17:12
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=30440&forum=7&start=0
カタナ
大ベテラン
会議室デビュー日: 2006/05/25
投稿数: 110
投稿日時: 2007-02-21 18:10
todoさん返信ありがとうございます。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=30440&forum=7&start=0
を読んでみたのですが、最終的に不可能ということなのですよね?
なんらかの方法で、時間をかけずに簡単に逃げれる方法ってないのでしょうか?
もし簡単な方法がないのでしたら、下のページを参考にして処理を行ないたいと思います。
http://blogs.wankuma.com/jitta/articles/19448.aspx
よろしくご教授お願いいたします。






どっとねっとふぁん
ぬし
会議室デビュー日: 2005/02/23
投稿数: 935
投稿日時: 2007-02-21 18:52
別画面は必ず表示させないといけないですか?
処理をしている間に「処理中」の文字が画面にでていればいいだけなら、
「ASP.NETでいってみよう」という書籍にServer.Transferを使うことで
それを実現する方法が書いてあります。
たしかTransferをつかって(URLが変わらない)「処理中」という画面を
表示させ、その画面のmetaタグで実際の長い処理を行うページを呼び出す
といった方法だったかと。
詳しくは書籍を参照してください。
todo
ぬし
会議室デビュー日: 2003/07/23
投稿数: 682
投稿日時: 2007-02-21 19:04
引用:

なんらかの方法で、時間をかけずに簡単に逃げれる方法ってないのでしょうか?


popup_wait.aspxを別アプリにするとか。静的なページにするとか。

ただし、重い処理がブラウザ側もしくはサーバ側のタイムアウトを超える可能性があるのであれば、別の方法を考えるべきでしょう。

jittaさんのサンプルのように重い処理を別スレッドで動かすのがよいでしょう。

[ メッセージ編集済み 編集者: todo 編集日時 2007-02-21 19:05 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2007-02-21 19:34
引用:

カタナさんの書き込み (2007-02-21 18:10) より:
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?mode=viewtopic&topic=30440&forum=7&start=0
を読んでみたのですが、最終的に不可能ということなのですよね?
なんらかの方法で、時間をかけずに簡単に逃げれる方法ってないのでしょうか?


ちゃんと中身を読みましたか?
単に結論を見るだけではなくて、自分のしたいことと、どう関わってくるかを読み取らないと。

単に並列で動作しない、というだけの話なら、ポップアップの画面だけ
セッションを無効にするなり、読み取り専用にするなり、単なる静的ページにするなり
どうにでもできるでしょう。
カタナ
大ベテラン
会議室デビュー日: 2006/05/25
投稿数: 110
投稿日時: 2007-02-21 20:57
どっとねっとふぁんさん、todoさん、なちゃさん返信ありがとうございます。

todoさん、なちゃさんの言われる様に静的ページにしてみたら一応できました。
(※処理途中で子画面が閉じられたらとかいろいろ問題はありますが・・・)
1.ボタンを押す。
2.window.openで別画面起動(※別画面は静的ページ(html)とする。)
2-1 <meta http-equiv="Refresh" content="10">にて自分自身を再帰的に呼び出す。
2-2 javascriptのwindow.openerにて親画面の非表示テキストが"1"になったら子画面をクローズする。
3.サーバ側は続けて、処理が行なわれる。処理が終了したら非表示テキストに"1"を入れる。

どっとねっとふぁんさんの言われている方法は、まだ試していないのですが、「ASP.NETでいってみよう」という書籍を探してみて、調査したいと思います。

あと気になるのが、todoさんさんの言われている「ただし、重い処理がブラウザ側もしくはサーバ側のタイムアウトを超える可能性があるのであれば、別の方法を考えるべきでしょう」という部分です。
タイムアウトは設定を変更しなければIEの場合(今回対象ブラウザはIEのみです。)、60分のようなので問題ないかと考えているのですが、認識が間違っているでしょうか?よろしくご教授お願い致します。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-02-21 21:12
遅くなってごめんなさい。
まぁ、出てしまっていますが。

あと、全く勧められない方法ですが、Response.Write で、「ちょっと待ってね」「まだ待ってね」「もう少しだよ」「本当にあと少し」(くどい)とか、メッセージを出していく。。。

これがマイクロソフトのサイトに、サンプルとして載っているんだorz
_________________

スキルアップ/キャリアアップ(JOB@IT)