Nous l'utilisons pour renvoyer un fichier pour une exportation. Lorsque nous exécutons cette exportation sur un grand nombre d'enregistrements, l'exécution prend près de 10 minutes. Voici un extrait de code du code qui appelle réellement la méthode File() et renvoie le résultat.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
La méthode ExportFile réelle prend dans un ID, appelle une autre méthode, qui obtient un tas d'enregistrements de la base de données, effectue un tas de calculs sur chaque ligne, et crée ensuite un StringBuilder, et pour chaque Remplit de ligne StringBuilder, puis le place dans une liste (Of String), après avoir fait un .ToString(). Ensuite, cette méthode retourne List (Of String) à la méthode ExportFile et cette méthode crée un autre StringBuilder, ajoute toutes les chaînes de cette liste, la convertit en une grande chaîne et la définit sur la propriété ResponseString du résultat ('r 'dans le code ci-dessus).
Voilà comment cela fonctionne. Y a-t-il moyen d'accélérer ce processus, par exemple, beaucoup?
-Scott
Edit: Plus code
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
Lorsque j'exécute les requêtes SQL utilisées dans les opérations, elles s'exécutent instantanément. Le fichier en sortie a une taille de 1,16 Mo (tout le texte). Je pense que le ralentissement vient de la taille massive de la liste StringBuilder, et ensuite lorsque cette liste est ajoutée dans un seul StringBuilder et que .ToString() s'exécute dessus. Je ne sais pas comment faire pour que tout fonctionne plus vite. – Scott
@Scott, Post plus de code alors. Personne ne peut optimiser quelque chose qu'ils ne peuvent pas voir. – jfar
Juste posté le code de la fonction ExportFile(). Cela fonctionne avec la classe qui crée réellement l'objet, puis cette méthode renvoie le résultat à la méthode que j'ai publiée en premier. – Scott