2

これは古いClassicASPサイトで完全に機能しているため、非常に奇妙な問題です。基本的に、データベースにクエリを実行し、Response.Writeを介して約2200行のテキストをテキストファイルにエクスポートしてダイアログボックスに出力し、ユーザーがファイルを保存できるようにします。

Response.Clear()Response.ClearContent()Response.ClearHeaders()

    Dim fileName As String = "TECH" & test & ".txt"

    Response.AddHeader("Content-Disposition", String.Format("attachment; filename={0}", fileName))
    Response.ContentType = "text/plain"

    Response.Write(strHeader)

    Dim sw As New IO.StringWriter()

    Dim dtRow As DataRow
    For Each dtRow In dt3.Rows
        sw.Write(dtRow.Item("RECORD") & vbCrLf)
    Next

    Response.Write(sw.ToString)
    Response.Write(strTrailer & intRecCount)
    Response.End()

StringWriterを使用することも、単にResponse.Write(dt.Rows(i).Item( "RECORD")。toStringを使用することもできます。

いずれにせよ、エクスポートは私たちの開発サイトで恐ろしいハングを引き起こしています。私のローカルマシンはハングを引き起こさず、ほとんど瞬時に発生します。レコードセットはそれほど大きくなく、書き込んでいる行は小さいです。

なぜこれがぶら下がっているのか誰かが知っていますか?最終的にはファイルの保存と表示が可能になりますが、3〜4分をはるかに超えます。

4

3 に答える 3

2

リモート デバッガーをアタッチして、ハングしている場所を見つけますか?

それが文字列ライター ループなのか、それとも実際のクエリ コードなのか (ここでは提供されていません) を把握する必要があります。

于 2008-11-13T17:38:07.987 に答える
0

出力バッファがオーバーフローしている可能性があります。おそらくそこにカウンターを追加して、数百行ごとにフラッシュします。

また、基本的には、Response オブジェクトが StringWriter のほとんどの作業を行います。StringWriter を仲介として使用することは、おそらく冗長です。

于 2008-11-13T17:40:05.473 に答える
0

Both using StringWriter and DataTable are overkill.

Why not use directly SqlReader to get the results from the database, and while reading the reader, write directly to the output stream? Much faster, and much less memory consumed.

As an answer to your second question - why the ASP was working OK, I doubt that there you have stored the same content 3 times in memory in order to output it (in the DataTable, in the StringWriter and in the output buffer). My ASP is a little bit rusty, but I would guess that there you are using database reader of some sort.

Also, better employ some logging infrastructure (NLog, log4net), so you can output some timing about which operation delays how much, as an alternative to attaching a remote debugger.

于 2008-11-13T18:05:26.280 に答える