우리는이 파일을 사용하여 내보낼 파일을 반환합니다. 이 내보내기를 많은 레코드에서 실행하면 실행하는 데 10 분이 걸립니다. 다음은 실제로 File() 메서드를 호출하고 결과를 반환하는 코드의 코드 단편입니다. 실제 ExportFile 방법이 ID에 걸리는ASP.NET MVC FileContentResult SLOW
Public Function Export(ByVal ID As Integer) As FileContentResult
Dim str As String = String.Empty
Dim data() As Byte
Dim r As New ExportResult
Dim Test As New TestConnection(WebUtil.UserToken)
'This line is important coz IE download was prevented without this.
ControllerContext.HttpContext.Response.ClearHeaders()
r = Test.ExportFile(ID)
data = Encoding.ASCII.GetBytes(r.ResponseString)
Return File(data, "text/plain", r.DefaultFileName)
End Function
은 데이터베이스의 레코드의 무리를 얻는 다른 방법을 호출하여 각각의 행에 대한 연산의 무리를 행하고, 다음의 StringBuilder를 생성하고, 각 행으로 채워위한 StringBuilder를 호출 한 다음 .ToString()을 수행 한 후 List (Of String)로 팝합니다. 그런 다음이 메서드는 List (Of String)을 ExportFile 메서드에 반환하고이 메서드는 다른 StringBuilder를 만들고 해당 목록의 모든 문자열을 추가 한 다음 하나의 큰 문자열로 변환하고 결과의 ResponseString 속성으로 설정합니다 ('r '위의 코드에서).
이렇게 작동하는 방식입니다. 이 과정을 빨리 처리 할 수있는 방법이 있습니까?
-Scott
편집 : 더 코드
Public Function ExportFile(ByVal ID As Integer) As ExportResult
Dim result As New ExportResult
Dim s As New StringBuilder
'Get all Records
Dim dt As New DataTable
Using dal As New SQL
dal.Parameters.AddWithValue("@ID", ID)
dal.Execute("[dbo].[uspGet]", dt)
dal.Parameters.Clear()
End Using
Dim dataobj As New DataObj(dt, ID)
'Create FileName
If dt.Rows.Count > 0 Then
Dim StartDate As DateTime = DateTime.Parse(dt.Rows(0).Item("StartDate"))
Dim EndDate As DateTime = DateTime.Parse(dt.Rows(0).Item("EndDate"))
result.DefaultFileName = String.Format("HMDA_{0}_{1}.dat", String.Format("{0:MMyyyy}", StartDate), String.Format("{0:MMyyyy}", EndDate))
End If
'Add Title Line
s.AppendLine(dataobj.CreateTitleLine())
'Add all Record Lines
Dim records As List(Of String) = dataobj.CreateRecordLines()
Dim last As Integer = records.Count - 1
For i = 0 To last
If i = last Then
s.Append(records(i))
Else
s.AppendLine(records(i))
End If
Next
result.ResponseString = s.ToString
Return result
End Function
작업에 사용되는 SQL 쿼리를 실행하면 즉시 실행됩니다. 출력 된 파일의 크기는 1.16MB입니다 (전체 텍스트). 나는 StringBuilder 목록의 엄청난 크기에서 속도가 느려지고, 그 목록이 단일 StringBuilder에 추가 된 다음 .ToString()이 실행될 것이라고 생각합니다. 나는 모든 것을 더 빨리 달릴 수있는 방법을 모른다. – Scott
@Scott, 더 많은 코드를 게시하십시오. 아무도 볼 수없는 것을 최적화 할 수 없습니다. – jfar
방금 ExportFile() 함수의 코드를 게시했습니다. 이것은 실제로 객체를 생성하는 클래스와 함께 작동하고,이 메소드는 먼저 게시 한 메소드에 결과를 반환합니다. – Scott