Announcement

Collapse
No announcement yet.

Schreiben in Datei "ordentlich" abbrechen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Schreiben in Datei "ordentlich" abbrechen

    Hallo zusammen,

    Ich schreibe einen FileStream in eine Datei (.pdf). Dies dauert leider auf Grund von Bildern etc knapp 10 Sekunden.

    Ich habe mir daher folgendes gedacht- User gibt zunächst alle Daten ein und klickt anschließend auf PDF erstellen. Dies geschieht nun in einem neuen Thread, so dass der User (wenn er Fehler o.ä. feststellt die Daten weiterhin überarbeiten kann). Anschließend kann er noch einmal auf PDF erstellen klicken. Dabei soll folgendes geschehen:

    1) Wenn alte PDF-Erzeugung noch nicht fertig ist: breche die (= FileStream) ab.
    2) PDF-Datei löschen
    3) Neue Datei erzeugen

    Leider weiß ich nicht, wie ich (außer mit try-catch) den FileStream abbrechen kann, für Tips wäre ich dankbar

  • #2
    Was hat try ... catch mit abbrechen zu tun?
    Ohne Implementierungsdetails können wir hier schlecht helfen da dein Problem sonst eher unverständlich ist. Z.b. bei deinem Punkt 1 würde ich im Moment sagen wenn du abbrechen willst hör doch einfach auch in den Stream zu schreiben, schließe ihn und lösche die dazugehörende Datei.

    Comment


    • #3
      Ich versuche es noch einmal detaillierter zu beschreiben- Ich schreibe eine große Menge an Daten über einen FileStream in eine Datei (gleichzeitig, nicht nacheinander). Dies würde ich gerne unterbrechen , d.h. FileStream beenden, unvollständige Datei schließen.

      Der Rest ist eigentlich nicht wichtig, da das relativ wenig mit dem Problem zu tun hat.

      try-catch wäre halt eine Möglichkeit gewesen, dass ich den FileStream einfach mittendrin abbreche bzw. den Thread beende und dadurch eine Exception geworfen wird. Ist halt nur seeehr unschhön...

      Comment


      • #4
        Sorry, hilft mir immer noch nicht dein Problem zu verstehen.

        Die Daten tauchen doch nicht einfach plötzlich in deinem Stream auf und dann dauert nur das flushen lang. Was da lang dauert ist vermutlich das Erstellen der Daten des PDFs und dann (ich kann nur vermuten) werden die Daten so wie sie den erstellt wurden Blockweise in den Stream geschrieben. Also Block erstellen in den Stream schreiben, nächsten Block erstellen in den Stream schreiben, zwischen durch dann vielleicht mal flushen usw. Diese Schleife solltest du doch einfach abbrechen können? Wenn dem nicht so ist solltest du uns das besser erklären oder gleich zeigen. Sonst ist weiter raten angesagt.

        Comment


        • #5
          Okay, ich versuchs nochmal

          Ich nutze dbAutoTrack.PDFWriter als Klasse, um PDFs zu erzeugen. Hier ein Beispiel, wie dieser genutzt wird. Am Ende wird der Filestream genutzt.

          Code:
          	private void cbGenerate_Click(object sender, System.EventArgs e)
          	{
          		//Initialize PDF Document
          		Document _document = new Document();   
          		
          		_document.Title = "Welcome - PDF Sample";
          		_document.Author = "dbAutoTrack Ltd, USA";
          		_document.Creator = "dbAutoTrack.PDFWriter";
          		
          		//Compression is set to true by default.
          		//_document.Compress = false;
          
          		//Initialize new page with PageSize A4
          		Page page1 = new Page(PageSize.A4); 
          		
          		//Get the PDFGraphics object for drawing to the page.
          		PDFGraphics graphics1 = page1.Graphics;
          		
          		//using System.Drawing.Font;
          		System.Drawing.Font _font1 =  new Font("Arial", 10, FontStyle.Regular);
          		System.Drawing.Font _font2 =  new Font("Arial", 10, FontStyle.Bold);
          		System.Drawing.Font _font3 =  new Font("Arial", 10, FontStyle.Italic);
          		PDFFont _pdfFont1 = new PDFFont(_font1, false);
          		PDFFont _pdfFont2 = new PDFFont(_font2, false);
          		PDFFont _pdfFont3 = new PDFFont(_font3, false);
          		
          		//DrawString
          		graphics1.DrawString(50, 100, "Welcome to PDFWriter for .NET", RGBColor.Black, _pdfFont1, 10);    
          		graphics1.DrawString(50, 150, "Welcome to PDFWriter for .NET", RGBColor.Red, _pdfFont2, 12, false, false);
          		graphics1.DrawString(50, 200, "Welcome to PDFWriter for .NET by dbAutoTrack Ltd, USA.", RGBColor.Black, _pdfFont3, 12, true, false); 
          		
          		//Add the page to the Document
          		_document.Pages.Add(page1);  
          		
          		//Initialize new page with PageSize A4.
          		Page page2 = new Page(PageSize.A4);
          				
          		//Get the PDFGraphics object for drawing to the page.
          		PDFGraphics graphics2 = page2.Graphics;
          
          		//using Standard PDF Fonts
          		PDFFont _pdfFont4 = new PDFFont(StandardFonts.Helvetica, FontStyle.Regular);    
          		PDFFont _pdfFont5 = new PDFFont(StandardFonts.Helvetica, (FontStyle.Bold |FontStyle.Italic));
          		PDFFont _pdfFont6 = new PDFFont(StandardFonts.Helvetica, FontStyle.Bold);
          
          		//DrawString
          		graphics2.DrawString(50, 100, "Welcome to PDFWriter for .NET", RGBColor.Black, _pdfFont4, 10);    
          		graphics2.DrawString(50, 150, "Welcome to PDFWriter for .NET", RGBColor.Red, _pdfFont5, 12, false, false);
          		graphics2.DrawString(50, 200, "Welcome to PDFWriter for .NET by dbAutoTrack Ltd, USA.", RGBColor.Black, _pdfFont6, 12, false, false); 
          		
          		//Add the page to the Document
          		_document.Pages.Add(page2);
          			
          		FileStream _fs = new FileStream("Welcome_Sample.pdf", System.IO.FileMode.Create, System.IO.FileAccess.Write);  
          		try
          		{
          			//Generate PDF to the stream
          			_document.Generate(_fs); 
          			MessageBox.Show("Welcome_Sample.pdf generated successfully in Bin Folder", "PDF-Writer.NET by dbAutoTrack Ltd, USA."); 
          		}
          		finally
          		{
          			_fs.Flush();
          			_fs.Close();
          		}
          		
          	}
          Mein Code ist analog aufgebaut, allerdings wesentlich länger. Daher dauert das Ganze knapp 10 Sekunden.

          Ich biete dem User während der PDF-Erzeugung (die in einem seperaten Thread stattfindet) die Möglichkeit, Daten zu ändern. Wenn der User dies macht, so soll im Hintergrund automatisch eine aktualisierte PDF erzeugt werden -> So muss er wenn er letztendlich auf "PDF anzeigen" klickt nicht die kompletten 10 Sekunden warten

          Damit im Hintergrund die aktualisierte PDF erzeugt werden kann, muss natürlich die alte "Erzeugung" abgebrochen werden, wenn diese noch nicht beendet ist. Und genau hier liegt das Problem- Wenn der Filestream noch nicht fertig ist -> wie breche ich ihn ordentlich ab?

          Comment


          • #6
            Mein Code ist analog aufgebaut, allerdings wesentlich länger. Daher dauert das Ganze knapp 10 Sekunden.
            10 Sekunden sind viel, bei PDF-Erstellung anscheinend aber normal. Wie schnell macht das denn die oben gezeigte Kurzfassung? Wie lange braucht der Rechner für die Ausführung bis zu dieser Zeile, und wieviel Zeit wird für die Ausführung dieser einen Zeile benötigt:

            Code:
            _document.Generate(_fs);
            Weil mich das Thema PDF interessiert, hab ich mir mal die Seite http://www.dbautotrack.com/products/pdfwriter.html angeschaut. Es gibt eine Version mit kompletten Quelltext, und eine ohne dem. Welche hast Du? Bei ersterer wirst Du diesen Queltext studieren und an geeigneter Stelle eine Abbruchbedingung einfügen können. Bei letzterer kannst Du nur hoffen, dass der langsamere Teil der Ausführung nicht die Generate-Zeile ist.


            Aber die Komponente funktioniert nicht mit WPF, wenn ich das richtig sehe?
            Günther

            Comment


            • #7
              Wie Günther schon andeutet musst du _document.Generate abbrechen können. Wenn die Document Klasse da nicht mithilft hast du wenig saubere Möglichkeiten. Dann würde ich den Thread einfach zu Ende laufen lassen und das Ergebnis dann im Anschluss verwerfen, kannst ja erst mal dein Ergebnis in ein temporöres File streamen und am Ende dann das File an die richtige Stelle moven damit sich die eventuell laufenden mehreren Erstellthreads nicht in die Quere kommen.

              dbAutoTrack ist nicht gerade ein vertrauenerweckernder Hersteller. Die haben nicht mal die Dokumentation online Insofern kann ich da nur vermuten, aber gibt es keine Events die während dem generieren gefeuert werden? Also sowas wie PageReady oder ProgressChanged etc. wo man ansetzten könnte?

              Comment

              Working...
              X