Laden...

(Konsolen-)Anwendung wird beendet, obwohl noch asynchrone Aufgaben laufen

Erstellt von FOberwald vor 11 Jahren Letzter Beitrag vor 11 Jahren 806 Views
Thema geschlossen
F
FOberwald Themenstarter:in
2 Beiträge seit 2013
vor 11 Jahren
(Konsolen-)Anwendung wird beendet, obwohl noch asynchrone Aufgaben laufen

Hallo,

Ich habe eine kleine Konsolenanwendung geschrieben, welche mir den Inhalt verschiedener Url´s downloadet und lokal speichert.

Da es sich um eine größere Anzahl von Dateien handelt, will ich die Downloads Asyncron ausführen. Die Downloads werden in einer Schleife ausgeführt und in dem DownloadFileCompleted - Ereignis soll die Datei dann weiter verarbeitet werden (z.B sollen Änderungen am Text vorgenommen werden usw.)

Mein Problem ist nun folgendes: Sobald die Schleife durchgelaufen ist und somit alle Downloads gestartet wurden, beendet sich die Konsolenanwendung, ohne auf das abschließen aller Downloads zu warten.

Was mache ich hier falsch?

        public void DownloadDatasheets()
        {
            ArticleImportFile[] res = engine.ReadFile(sourceFile);            
            int fileLines = res.Length;
            
            // Downloading sheets
            for (int i = 1; i < 10000; i++)
            {
                string url = res[i].sheet;
                string fileDirectory = tempPath + res[i].map_id + ".txt";

                try
                {
                    WebClient client = new WebClient();
                    client.DownloadFileCompleted += client_DownloadFileCompleted;
                    client.DownloadFileAsync(new Uri(url), fileDirectory, res[i].map_id);
                }
                catch(Exception e)
                {                    
                    Console.WriteLine(e);
                }
            }
        }

 void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
        {
            // Edit downloaded Data here
        }
J
251 Beiträge seit 2012
vor 11 Jahren

Hey,

Von wo aus wird den DownloadDatasheets() aufgerufen?

Mal mit dem Debugger gecheckt, was dein Programm nach der Schleife macht?

C
258 Beiträge seit 2011
vor 11 Jahren

Da ich nichts anderes sehe gehe ich davon aus das du die Methode im MainThread aufrufst.

Warum sollte dieser warten wenn er mit allem fertig ist, wenn du ihm nicht sagst auf was er warten soll.

Du kannst den MainThread mithilfe eines ManualResetEvents anhalten bis dein FileComplete event 10000 aufgetreten ist.

49.485 Beiträge seit 2005
vor 11 Jahren
F
FOberwald Themenstarter:in
2 Beiträge seit 2013
vor 11 Jahren

@ Console32

Die Methode wird im MaintThread aufgerufen.

Sry das ich diese Info nicht angegeben habe 🤔

Mit welcher Methode kann ich der ManualResetEvent Klasse denn sagen das ich das FileComplete Event 10000 mal auffgerufen haben möchte?

Komme da gerade noch nicht ganz so hinter.

Hinweis von herbivore vor 11 Jahren

Du hast alle Informationen, die du brauchst, und sogar ein Codebeispiel. Die Umsetzung ist deine Aufgabe. Vermutlich fällt es dir wie Schuppen von den Haaren, wenn du es nochmal durchdenkst. Bitte beachte, dass wir die Grundlagen voraussetzen, siehe [Hinweis] Wie poste ich richtig? Punkt 1.1.1.

Thema geschlossen