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