Hallo an alle, ich hätte da mal ne Frage: bitte seid nicht ganz so hart, ich programmiere jedes halbe Jahr mal ein bisschen. Daher bin ich da immer wieder am einfinden. Ich habe folgendes schon funktionsfähig: - Prüfung auf neue Version meines Programms - Download des .msi - Starten der Installation ************************* CODE ***************** public static bool DownloadNewVersion() { WebClient wc = new WebClient(); try { if (File.Exists(file)) File.Delete(file); if (System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageNam e == "DE") { //System.Threading.Thread.Sleep(1000); wc.DownloadFile(InstallerFileDE, file); } else { //System.Threading.Thread.Sleep(1000); wc.DownloadFile(InstallerFileEN, file); } } catch { System.Windows.Forms.MessageBox.Show(ResourcesText.DOWNLOADERROR); return false; } return true; ******************** CODE ENDE ************************** Problem: -Während des Download wird nichts angezeigt, was etwas verwirrend ist. Nun wollte ich ein zweites Fenster. Welches kurz vor Download aufgeht auf dem einfach steht "Bitte warten...." und sich schließt sobald der Download abgeschlossen ist. Kann mir jemand hier behilflich sein? Mit MessageBox brauche ich wieder eine Eingabe, das möchte ich nicht. Wenn ich eine zweite Form anlege hüpfe ich dorthin aber komme nicht mehr zurück...? Vielen Dank für jede Mühe schon mal
Eine zweite Form ist schon der richtige Ansatz. Der kannst du doch einfach per Methodenaufruf Bescheid geben, wen der DL fertig ist. Dann kann sich die Form automatisch schließen. (Oder du schließt die Form direkt "von außen")
Vorschlag blockiere das Aktuelle Fenster und zeige ein Label an lade statt syncron asyncron runter WebClient.DownloadFileAsync() bei Beendigung wird ein downloadcompletet event ausgelöst danch kannst du das fenster wieder freigeben und das lable verstecken
1 | public static void DownLoadFileInBackground2 (string address) |
2 | {
|
3 | WebClient client = new WebClient (); |
4 | Uri uri = new Uri(address); |
5 | |
6 | // Specify that the DownloadFileCallback method gets called
|
7 | // when the download completes.
|
8 | client.DownloadFileCompleted += new AsyncCompletedEventHandler (DownloadFileCallback2); |
9 | // Specify a progress notification handler.
|
10 | client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressCallback); |
11 | client.DownloadFileAsync (uri, "serverdata.txt"); |
12 | }
|
Hallo, danke für die Vorschläge. Das mit der Form habe ich ja schon probiert. Wenn ich die Form aufgerufen habe zur Anzeige an dieser Stelle: if (System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageNam e == "DE") { form2.Show(); wc.DownloadFile(InstallerFileDE, file); } Hat er den DL nicht angefangen, da er ja in der form2 war und nicht mehr zurück ist. Mir ist das im MOment unklar wie ich die Form aufrufe und er trotzdem den DL startet. Schliessen kann ich die Form dann ja jederzeit beliebig. DAs mit dem Label ist eine schöne einfache Sache, wenn ich es jedoch etwas schicker mit der Form hinbekomme, finde ich schöner.Trotzdem vielen Dank dafür.
Das kann nicht sein. sobald die Form sichtbar ist kehrt die Funktion zurück und geht zur nächsten Anweisung.
Wenn du aber eh vor hast den ganzen status darzustellen dann könntest du die Form schon vorher aufrufen bevor du deine Prüfungen durchführst und die Ergebnisse anzeigen.
Sebastian-L schrieb: > Das kann nicht sein. Hi, ok, hast recht er macht es richtig. Aber meine Form2 wird nicht richtig angezeigt..... Ich hatte gerade aus Versehen Form2.ShowDialog(); drinne ...... dann ist klar dass er hier etwas haben will und stehen bleibt. Ich probiere es nochmal......
Du musst trotzdem asyncron laden weil sonst die eventloop blockiert ist.
So....hm.... geht nicht.... irgendwas habe ich bestimmt och verkehrt: Hier mal den ganzen Code: Form2 soll angezeigt werden: ************CODE **************** class UpdateChecker { public static bool DownloadNewVersion() { WebClient wc = new WebClient(); try { if (File.Exists(file)) File.Delete(file); if (System.Globalization.CultureInfo.CurrentCulture.TwoLetterISOLanguageNam e == "DE") { //System.Threading.Thread.Sleep(1000); wc.DownloadFile(InstallerFileDE, file); } else { cyclotest.Form2 form2 = new cyclotest.Form2(); form2.Show(); //System.Threading.Thread.Sleep(1000); wc.DownloadFile(InstallerFileEN, file); } } catch { System.Windows.Forms.MessageBox.Show(ResourcesText.DOWNLOADERROR); return false; } return true; } } ********CODE ENDE************** in der Form2 ist nur Standardcode drin: *****************CODE************ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace cyclotest { public partial class Form2 : Form { public Form2() { InitializeComponent(); } } ************** CODE ENDE ************* }
Was geht nicht Bremskraft lässt nach ->bremse kaputt ich sehe nichts --> Licht hinten links defekt ...
hehehe ... bremse gar nicht vorhanden :-D Sorry, also er springt in die Initialisierung der form2 und dann wieder zurück. Dann wenn er "form2.Show()" ausführen soll, zeigt er nur ein weisses Fenster ohne Inhalt und geht nicht weiter....?!
Mach mal einen Brechpunkt und prüfe ob er wirklich nicht weiter geht wenn er weiter geht und das fenster weiß bleibt sieh meinen post weiter oben
Sebastian-L schrieb: > Du musst trotzdem asyncron laden weil sonst die eventloop blockiert ist. Da empfiehlt sich mal wieder der gute alte BackgroundWorker... ("Wenn's mal wieder länger dauert – schnapp' dir 'n BackgroundWorker!")
Frage Warum hast du eine updater class wenn sie nur eine methode hat. wenn du schon trennen willst darfst du hier aber auch keine Forms öffnen. Pack das ganze in dein Hauptfenster oder trenne es von gui sachen.
oder nutze schon eine vorhandene asyncFunktion eines Objekts das ist einfacher
hi danke Wenn ich asynchron lade, bekomme ich einen Fehler beim starten der Installation. Ich probiere und lese mich mal in den Backgroundworker ein. DEn kenne ich noch so nicht und da ich kein Zeitdruck habe, kann ich da was lernen noch dabei... hoffe ich... Danke für die Tipps und Hilfe, hoffe es kann damit noch jemanden geholfen werden.
Sebastian-L schrieb: > Welchen Fehler (verdammt) HI sorry, ich bekam den Fehler dass meine Updatedateinstallationsdatei nicht für mein System ist. Quasi die gleiche Meldung von Windows, wenn man eine 64-bit Version auf einem 32-bit installiert. Gruß
Das hat aber per se nix mit dem code oben zu tun sondern mit deinem ganzen programm
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.