Forum: PC Hard- und Software C# Wartefenster, Downloadfesnter


von Matze (Gast)


Lesenswert?

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

von Borislav B. (boris_b)


Lesenswert?

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")

von Sebastian-L (Gast)


Lesenswert?

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
}

von Matze (Gast)


Lesenswert?

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.

von Sebastian-L (Gast)


Lesenswert?

Das kann nicht sein.
sobald die Form sichtbar ist kehrt die Funktion zurück und geht zur 
nächsten Anweisung.

von Sebastian-L (Gast)


Lesenswert?

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.

von Matze (Gast)


Lesenswert?

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......

von Sebastian-L (Gast)


Lesenswert?

Du musst trotzdem asyncron laden weil sonst die eventloop blockiert ist.

von Matze (Gast)


Lesenswert?

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 *************
}

von Sebastian-L (Gast)


Lesenswert?

Was geht nicht

Bremskraft lässt nach ->bremse kaputt

ich sehe nichts --> Licht hinten links defekt

...

von Matze (Gast)


Lesenswert?

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....?!

von Sebastian-L (Gast)


Lesenswert?

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

von Borislav B. (boris_b)


Lesenswert?

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!")

von Sebastian-L (Gast)


Lesenswert?

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.

von Sebastian-L (Gast)


Lesenswert?

oder nutze schon eine vorhandene asyncFunktion eines Objekts das ist 
einfacher

von Matze (Gast)


Lesenswert?

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.

von Sebastian-L (Gast)


Lesenswert?

Welchen Fehler (verdammt)

von Matze (Gast)


Lesenswert?

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ß

von Sebastian-L (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.