2016-07-26 18 views
0

Ich habe einen Web-Scheduler (Webanwendung) erstellt, um alle 5 Minuten eine Methode in der Datei global.asax aufzurufen. Es wird erfolgreich ausgelöst.Datei wird von einem anderen Prozess verwendet C# Visual Studio

In der Methode erstellen ich Excel mit Interop-DLL und tun "Speichern unter" als Operation. Zuerst überprüfe ich, ob die Datei in dem Ordner existiert, falls vorhanden, lösche ich sie und mache "Speichern unter". Zum ersten Mal funktioniert es gut. Für den zweiten Aufruf, wenn die Datei existiert, kann ich sie nicht löschen. Es besagt, dass die Datei von einem anderen Prozess verwendet wird.

Sobald der Debugger gestoppt und erneut ausgeführt wird, kann ich die Datei löschen, auch das funktioniert nur zum ersten Mal.

Ich denke, Visual Studio (Asp.net Entwicklungsserver) schließt die Datei. Sobald der Entwicklungsserver gestoppt ist, kann ich ihn löschen.

finden Sie den Code unten: -

string fullFileName = Path.Combine(Path.GetTempPath(), testf); 
 
FileInfo TheFileInfo = new FileInfo(filePath); 
 

 
if (TheFileInfo.Exists) 
 
{ 
 
    File.Delete(fullFileName); 
 
} 
 
    
 
xlWorkBook.SaveAs(fullFileName, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue,misValue); 
 
//xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass(); 
 
GC.Collect(); 
 
GC.WaitForPendingFinalizers(); 
 
xlWorkBook.Close(true, misValue, misValue); 
 
xlApp.Quit(); 
 
xlApp.Application.Quit(); 
 

 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(chartRange); 
 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlWorkSheet); 
 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlWorkBook); 
 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp);

Bitte helfen, dieses Problem zu beheben.

+0

[Verwenden Sie kein Office Interop mit ASP.NET] (https://support.microsoft.com/en-us/kb/257757). Du wirst Dinge vermasseln, es wird langsam, und es gibt normalerweise eine schönere Art davon zu gehen. – mason

Antwort

0

Sie müssen ein Objekt erstellt haben, um auf die Excel-Datei zugreifen zu können. Versuchen Sie, das Objekt strikt zu schließen. Wenn dieses Objekt nicht entsorgt wird, erhalten Sie diesen Fehler. Excel-Objekte sind schwer.

0

Microsoft empfiehlt derzeit keine Automatisierung von Microsoft Office-Anwendungen aus einer unbeaufsichtigten, nicht interaktiven Clientanwendung oder -komponente (einschließlich ASP-, ASP.NET-, DCOM- und NT-Dienste), da Office möglicherweise ausgestellt wird instabiles Verhalten und/oder Deadlock, wenn Office in dieser Umgebung ausgeführt wird.

Wenn Sie eine Lösung erstellen, die in einem serverseitigen Kontext ausgeführt wird, sollten Sie versuchen, Komponenten zu verwenden, die für die unbeaufsichtigte Ausführung gesichert wurden. Oder sollten Sie versuchen, Alternativen zu finden, die zumindest einen Teil des Codes erlaubt clientseitige auszuführen. Wenn Sie eine Office-Anwendung von einer serverseitigen Lösung aus verwenden, fehlen der Anwendung viele der für die erfolgreiche Ausführung erforderlichen Funktionen. Darüber hinaus gehen Sie mit der Stabilität Ihrer Gesamtlösung Risiken ein. Lesen Sie mehr dazu im Artikel Considerations for server-side Automation of Office.

Sie können das Open XML SDK verwenden, siehe Welcome to the Open XML SDK 2.5 for Office für weitere Informationen. Oder andere Komponenten von Drittanbietern, die für die serverseitige Ausführung entwickelt wurden.