Laden...

Backgroundworker benachrichtigt nicht

Erstellt von schuppsl vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.004 Views
S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 16 Jahren
Backgroundworker benachrichtigt nicht

Hallole.
Ich beschäftige mich gerade mit FTP und Backgroundworker.
Das folgende Programm liest ein Verzeichnis aus und vergleicht das Änderungsdatum mit in einer Datei gespeicherten Informationen.
Ist eine Datei neuer, wurde also geändert, dann erscheint sie im zweiten Fenster der Listbox.
Da gibts nun nen Button mit dem ich die ausgewählten Dateien per FTP hochladen kann.
Das Funktioniert soweit.
Ich nun einen Backgroundworker implementiert der das hochladen der Dateien übernehmen soll.
Funktioniert eigentlich auch.
Das mit dem Worker habe ich aus dem Galileo Openbook.
Der Worker soll mich nun informieren wenn die Datei hochgeladen ist, was er ja mit

backgroundWorker1_RunWorkerCompleted
tun sollte.

Macht er aber nicht.

Weiterhin möchte ich in der Informationszeile des Programmes den aktuellen Status ausgeben.
Mache ich aber in den Worker die Zuweisung, dann bricht er an dieser Stelle ab und lädt die Datei nicht mehr hoch.
Ich darf also in der Workerfunktion nichts anderes als den eigentlichen Upload machen...(Fett markiert im DoWork).

Ich weiß nicht wo der Fehler ist.
Die Benachrichtigungen habe ich auf true gesetzt.

Bestimmt kann das jemand von Euch erfahreren C#lern herausfinden....



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Net;


namespace CheckDownload
{
    public partial class Form1 : Form
    {
        string initPath = @"M:\Daten\Doku_Optionen";
        string DatPath= @"./filelist.list";
        string ausgabe;
        string vergleich;
        int nSelectedIndex;
        int itemCount;
        string pathmit;
        string pathohne;
        string[] arr;
        WebClient c;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void btnCheckPath_Click(object sender, EventArgs e)
        {
           

            try
            {

                FileStream fs = new FileStream(DatPath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read, 16);
                fs.Seek(0, SeekOrigin.Begin);
              
                StreamWriter writer = new StreamWriter(fs);
                
                StreamReader reader = new StreamReader(fs);
                                
                string[] dirList = Directory.GetDirectories(initPath);
                string[] fileList = Directory.GetFiles(initPath);
                
                txtStatus.Text = initPath + "   " + "O.K.";
                btnCheckPath.Enabled = false;
                

                /*foreach ( string dir in dirList )
                {
                    lBAuflistung.Items.Add(dir);
                    
                }*/
                foreach ( string fil in fileList )
                {
                
                    DateTime lastAcc = Directory.GetLastWriteTime( fil );
                    
                    ausgabe = fil + "  " + lastAcc.ToString();
                    lBAuflistung.Items.Add(ausgabe);

                    reader.ReadLine();
                    vergleich = reader.ReadLine();

                    if ( vergleich != lastAcc.ToString() )
                    {
                        string myDat = Path.GetFullPath(fil);
                       
                        lBAenderung.Items.Add( myDat );

                    }

                    if ( chkInitialisieren.Checked == true )
                    {
                          writer.WriteLine(fil);
                          writer.WriteLine(lastAcc.ToString()); 
                    }
                    
                }

                writer.Close();
                reader.Close();
            }
            catch ( Exception ex )
            {
                txtStatus.Text = ex.Message;
            }          
        }

        private void btnEnde_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            
            arr = new string[ lBAenderung.SelectedItems.Count ];
            lBAenderung.SelectedItems.CopyTo(arr, 0);

            string ftpFilename = "ftp.xxxx.de";// +FileName;


            try
            {
               
                c = new WebClient();
                c.Credentials = new NetworkCredential("xxxxx", "xxxxxxxx");
              
                txtStatus.Text = "Verbindung wird aufgebaut...";

                
               
                proFuellen.Maximum = 100;
                proFuellen.Step = 1;
                proFuellen.Value = 1;
              [B]   this.backgroundWorker1.RunWorkerAsync();[/B]
              
            
            }
            catch ( WebException w )
            {
                MessageBox.Show(w.ToString(), "Fehler", MessageBoxButtons.OK, MessageBoxIcon.Error);

            }
        }

        private void [B]backgroundWorker1_DoWork[/B](object sender, DoWorkEventArgs e)
        {

           
            foreach ( string myItems in arr )
            {
                pathmit = Path.GetFullPath(myItems);
                pathohne = Path.GetFileName(myItems);

                string myReadyItems = pathohne.Replace(" ", "_");

            [B] //  this.txtStatus.Text = "Dateien werden gesendet...bitte warten....";[/B]

                c.UploadFile("ftp://ftp.xxx.de/test/" + myReadyItems, @"" + pathmit + "");
                
                this.backgroundWorker1.ReportProgress(80);
               
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            txtStatus.Text = "Upload Abgeschlossen!";
            proFuellen.Value = 100;

        }


        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // ProgressBar einstellen
            proFuellen.Value = e.ProgressPercentage;
           

        }


       
    }
}


V
86 Beiträge seit 2008
vor 16 Jahren

Hi
Also du musst dem BackgroundWorker natürlich sagen welche Methoden er verwenden soll.
Es ist glaub einfacher das über Delegaten zu lösen, schau mal hier im forum nach backgroundworker, da gibts auch Artikel dazu die sehr gut sind.

S
schuppsl Themenstarter:in
789 Beiträge seit 2007
vor 16 Jahren

Aha, also muss ich das doch noch machen.
Laut Galileo kommt es so rüber, als wenn die Events bereits implementiert sind.
Ich habe ja in der GUI das so eingestellt...

Edit: Also so geht natürlich:

this.backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
            this.backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted); 
        }

Danke für den Hinweis und Grüße