Announcement

Collapse
No announcement yet.

BackgroundWorker

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

  • BackgroundWorker

    Hallo Zusammen, ich habe folgendes Problem. Ich möchte mit dem BackgroundWorker eine Methode anstossen und gleichzeitig Zahlen in aufsteigender Reihenfolge anzeigen lassen.

    Leider sind meine Versuche ohne ein Ergebnis. Entweder die Zahlen zählen hoch aber die Daten werden nicht kopiert. Oder die Daten werden kopiert aber das Fenster öffnet sich nicht. Oder es geschieht gar nichts.

    Ich rufe aus einer anderen Classe eine Klasse für das Anzeigen der Zahlen und das Kopieren auf. Sobald sich die Klasse öffnet, sollten die Zahlen sich solange addieren bis es entsprechend zu einem Ende oder einem Abbruch des Kopiervorgangs kommt.

    Hier mein bisheriger Versuch (FILESPATH ist aus Sichherheitsgründen nur ein Beispiel. CertificateValidation ist eine separate Klasse für das auslesen einer https-Seite. Die ist hier nicht mit aufgeführt.)
    [highlight=c#]
    using System;
    using System.ComponentModel;
    using System.Net;
    using System.Windows.Forms;

    namespace DownloadModul
    {
    public partial class DownloadWindow : Form
    {
    private string verzeichnis;

    private bool runThread = true;
    private bool runCopy = false;
    private int zahl = 0;
    private const string FILESPATH = @"https://xxxxx:[email protected]/customer/";

    public DownloadWindow(string verzeichnis)
    {
    InitializeComponent();

    backgroundWorker1.WorkerReportsProgress = true;
    backgroundWorker1.WorkerSupportsCancellation = true;
    this.verzeichnis = verzeichnis;
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
    BackgroundWorker worker = sender as BackgroundWorker;

    while (runThread)
    {
    if (worker.CancellationPending == true)
    {
    e.Cancel = true;
    }
    else
    {
    System.Threading.Thread.Sleep(100);
    worker.ReportProgress(zahl++);
    }
    }
    }

    private void btnExit_Click(object sender, EventArgs e)
    {
    Close();
    }

    private void btnAbort_Click(object sender, EventArgs e)
    {
    if (backgroundWorker1.WorkerSupportsCancellation == true)
    {
    // Cancel the asynchronous operation.
    backgroundWorker1.CancelAsync();
    }
    }

    private void DownloadWindow_Load(object sender, EventArgs e)
    {
    ActiveForm.Text = "URL-Download";
    label1.Text = "Download URL-Files. Please wait....";

    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
    label1.Text = (e.ProgressPercentage.ToString());
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
    if (e.Cancelled == true)
    {
    label1.Text = "Canceled!";
    }
    else if (e.Error != null)
    {
    label1.Text = "Error: " + e.Error.Message;
    }
    else
    {
    label1.Text = "Done!";
    }
    }

    private void copyFiles()
    {

    System.Net.ServicePointManager.CertificatePolicy = new CertificateValidation();
    try
    {
    WebClient Client = new WebClient();
    NetworkCredential cred = new NetworkCredential();
    cred.UserName = "xxxx";
    cred.Password = "xxxxx";
    Client.Credentials = cred;
    Client.DownloadFile(FILESPATH + "update.sig", verzeichnis + "update.sig");
    Client.DownloadFile(FILESPATH + "update.tgz", verzeichnis + "update.tgz");

    runThread = false;
    }
    catch (Exception ex)
    {
    MessageBox.Show(text: string.Format("Fehler{0}", ex.Message));
    }
    }

    private void DownloadWindow_Activated(object sender, EventArgs e)
    {

    if (backgroundWorker1.IsBusy != true)
    {
    // Start the asynchronous operation.
    backgroundWorker1.RunWorkerAsync();
    }
    copyFiles();

    }
    }
    }
    [/highlight]
    Was habe ich nicht beachtet? Die Internetbeispiele beinhalten alle, dass innerhalb des DoWork die Ausführungen der Schleifen oder irgendwelcher Bekannten Werte vorhanden sind. Das habe ich nicht. Ich muss auf die globale Variable reagieren können, da ich nicht weiß, wie groß die Datenmenge oder die Datenleitung ist.

    Vielleicht habt Ihr eine Idee?

    Vielen Dank für Eure Bemühungen

    Gruß Lerando

  • #2
    Entweder die Zahlen zählen hoch aber die Daten werden nicht kopiert. Oder die Daten werden kopiert aber das Fenster öffnet sich nicht
    Was haben die Zahlen mit deinen Files zu tun? Was für ein Fenster?

    Wenn du mit zählen und gleichzeitig anzeigen willst wieviele Files runtergeladen wurden mußt du schon mit dem ReportProgress Aufruf zwischen die einzelnen DownLoadFile aufrufe. Vielleicht solltest du auch Code zeigen der nicht funktioniert. Da der gezeigte Code jetzt nur zählt gehe ich mal davon aus das das funktioniert (also hoch zählt und das anzeigt). Wenn du von usn Hilfe willst zum Problem 'zählen und downloaden' solltest du uns auch deinen entsprechenden Code zeigen der nicht funktioniert.

    Comment


    • #3
      Danke für den Hinweis.

      Ich rufe aus einem Projektmodul ohne Oberfläche dieses DownloadWindow auf. D. h. dass ich sozusagen eine Klasse so anpassen muss, das Daten via Internet heruntergeladen werden. Wie gesagt, es ist kein Button vorhanden und ich habe auch keine Oberfläche.

      Mein Gedanke war, dass ich eine Window-Form bei der Ausführung anzeige, die einfach nur Zahlen hochzählt um dem Benutzer zu zeigen, dass der Kopiervorgang läuft.

      Es soll also zum einen der Kopiervorgang gestartet werden ("copyFiles()") und andererseits sollen die Zahlen hochzählen bis der Kopiervorgang beendet ist.

      Mein Beispiel lässt zwar die Zahlen hochzählen aber der Kopiervorgang wird nicht gestartet. Es sollte aber beides paralell passieren.

      Und so wie ich es programmiert habe funktioniert es eben nicht.

      Vielen Dank für Eure Unterstützung.

      Gruß Lerando

      Comment


      • #4
        Im Moment sollte copyFiles im Haupthread laufen. Dein Backgroundworker versucht aber gleichzeitig über ProgressChanged im Hauptthread die UI zu aktualisieren. Da der eigentlich mit copyFiles beschäftigt sein sollte wird es zu keiner Aktualisierung kommen. Eigentlich willst du 3 Sachen machen. Downloaden, zählen und die UI aktualisieren. Da braucht es nach deinem bisherigen Anwendungsdesign einen weiteren Thread in dem du copyFiles ausführst.

        Alternative wäre z.B. die Downloads über DownloadFileAsync asynchron auszuführen.

        Warum startest du den Download aus dem Activated Event? Das sieht doch eher ungewöhnlich aus.

        Comment


        • #5
          Originally posted by Ralf Jansen View Post
          Warum startest du den Download aus dem Activated Event? Das sieht doch eher ungewöhnlich aus.
          Damit gebe ich der Windows-Form die Zeit um sich aufzubauen. So funktionierte es meistens am besten. (==>>> ich rufe diese WindowForm aus einer Klassenbibliothek auf. Kein Window)

          Originally posted by Ralf Jansen View Post
          Alternative wäre z.B. die Downloads über DownloadFileAsync asynchron auszuführen.
          Werde ich mir anschauen. Vielen Dank für den Tip.

          Originally posted by Ralf Jansen View Post
          Im Moment sollte copyFiles im Haupthread laufen. Dein Backgroundworker versucht aber gleichzeitig über ProgressChanged im Hauptthread die UI zu aktualisieren. Da der eigentlich mit copyFiles beschäftigt sein sollte wird es zu keiner Aktualisierung kommen. Eigentlich willst du 3 Sachen machen. Downloaden, zählen und die UI aktualisieren. Da braucht es nach deinem bisherigen Anwendungsdesign einen weiteren Thread in dem du copyFiles ausführst.
          Ich habe versucht einen zweiten Backroundworker zum laufen zu bringen, allerdings beiss ich mir dabei die Zähne aus. Hast Du zufällig ein Beispiel??

          Vielen Dank Lerando

          Comment


          • #6
            Damit gebe ich der Windows-Form die Zeit um sich aufzubauen. So funktionierte es meistens am besten. (==>>> ich rufe diese WindowForm aus einer Klassenbibliothek auf. Kein Window)
            Das wäre die Erklärung beim Shown Event. Activated kommt unter Umständen nicht nur einmal.

            ein Beispiel??
            Schwierig. Eigentlich würde ich sagen wer einen Backgroundworker hinbekommt bekommt auch zwei Backgroundworker hin. Da ich hier das konkrete Problem nicht sehe weiß ich nicht was ich in einem Beispiel zeigen sollte.

            Comment


            • #7
              Vielen Dank für Deine Hilfe. Habe den zweiten BackgroundWorker hinbekommen.

              Soll ich meine Lösung hier posten?

              Gruß Lerando

              Comment

              Working...
              X