none
WPF friert ein. RRS feed

  • Frage

  • Hallo, ich habe hier ein Programm erstellt mit Progressbar. Das friert mir aber ein. Der Programmblauf dauert etwas, weil mehrere Koopierschritte und Sortierschritte erfolgen. Das ganze wird über einen Start Button gestartet.

    Kann man das irgendwie besser machen ? Das ganze habe ich bereits in einen Backgroundworker testweise eingefügt. Das klappt aber irgendwie nicht. Da gibt es dann Fehler wie Threadübergreifend geht nicht. Vielleicht hat jemand eine bessere Lösung was das einfrieren der WPF betrifft. Vielen Dank schonmal.

    Hier mal ein Teil meines Codes.

    namespace WindowsFormsApp3
    {
        public partial class Form1 : Form
        { 
             // Quelllaufwerk
             String From_Directory = (@"X:\Fahrzeugdaten\1");       
             String From_Directory1 = (@"X:\Fahrzeugdaten\2");        
             String From_Directory2 = (@"X:\Fahrzeugdaten\3");        
             String From_Directory3 = (@"X:\Fahrzeugdaten\4");        
             String From_Directory4 = (@"X:\Fahrzeugdaten\5");        
             String From_Directory5 = (@"X:\Fahrzeugdaten\6");        
             String From_Directory6 = (@"X:\Fahrzeugdaten\7");
             String FromDSK = (@"X:\Fahrzeugdaten\8");

            //Einstellungen für Variables Laufwerk

            string lfw1 = @"X:\BackupTool\Settings\lfw1.ini"; 
            string lfw2 = @"X:\BackupTool\Settings\lfw2.ini"; 
            string lfw3 = @"X:\BackupTool\Settings\lfw3.ini"; 
            string lfw4 = @"X:\BackupTool\Settings\lfw4.ini";

            public Form1()
            {
                InitializeComponent();             
            }

            //Klassenaufruf
            FoldersSubfolder service;
           
            private void Form1_Load(object sender, EventArgs e)
            {
                progressBar1.Value = 0;
                progressBar1.Minimum = 5;
                progressBar1.Maximum = 100;
            }
            private void Button1_Click(object sender, EventArgs e)
            {
               
                // Quelldaten prüfen ob vorhanden, wenn nicht dann beenden.
                if (!Directory.Exists(@"X:\Fahrzeugdaten"))
                {
                    MessageBox.Show("Quelldaten nicht vorhanden!\nKopiere die Daten in das Laufwerk \t X:\\Fahrzeugdaten.");
                    return;
                }

                // Kalenderwoche ermitteln.
                CultureInfo myCI1 = new CultureInfo("de-DE");
                Calendar myCal1 = myCI1.Calendar;
                CalendarWeekRule myCWR01 = myCI1.DateTimeFormat.CalendarWeekRule;
                DayOfWeek myFirstDOW1 = myCI1.DateTimeFormat.FirstDayOfWeek;
                if (Directory.Exists(@"X:\Fahrzeugdaten" + " Kw " + myCal1.GetWeekOfYear(DateTime.Now, myCWR01, myFirstDOW1)))
                {
                    Directory.Move(@"X:\Fahrzeugdaten" + " Kw " + myCal1.GetWeekOfYear(DateTime.Now, myCWR01, myFirstDOW1), @"X:\Fahrzeugdaten" + " Kw " + myCal1.GetWeekOfYear(DateTime.Now, myCWR01, myFirstDOW1) + " " + "Sek. " + DateTime.Now.Second);
                }

                // Textboxen auf Null setzen. (Text löschen)
                label1.Text = "";
                label2.Text = "";
                richTextBox1.Text = "";
                richTextBox2.Text = "";
                progressBar1.Value = 8;
                progressBar1.Update();
                DateTime jahr = DateTime.Now;
                jahr.ToString("YYYY");


                try
                {
                    string To_Directory = File.ReadAllLines(lfw2)[0];
                    DirectoryInfo Dir = new DirectoryInfo(From_Directory);
                    if (!Dir.Exists)

                    {
                        throw new Exception("Zielordner nicht vorhanden:" + From_Directory);
                    }

                    if (!Directory.Exists(To_Directory +"\\Fahrzeugdaten" + " " + jahr.Year +\\ET42x\\1))
                    {
                        Directory.CreateDirectory(To_Directory + "\\Fahrzeugdaten" + " " + jahr.Year).CreateSubdirectory("ET 42x\\1");
                    }

                    FileInfo[] files = Dir.GetFiles();
                    foreach (FileInfo file in files)
                    {
                        string Temppath = Path.Combine(To_Directory + "\\Fahrzeugdaten" + " " + DateTime.Now.Year + "\\ET 42x\\1", file.Name);

                        try
                        {
                            file.CopyTo(Temppath);
                            progressBar1.Value = 10;
                            progressBar1.Update();
                            label1.Text = progressBar1.Value.ToString() + "%";
                            richTextBox2.Text = richTextBox2.Text + "\n" + file.FullName + "\n";


                        }
                        catch (System.IO.IOException ex)
                        {
                            richTextBox1.Text = richTextBox1.Text + "\n" + ex.Message + "\n";
                            progressBar1.Value = 10;
                            progressBar1.Update();
                            label1.Text = progressBar1.Value.ToString() + "%";
                        }
                        finally
                        {
                        }
                    }
                }
                catch (System.IO.FileNotFoundException)
                {
                    MessageBox.Show("! Initialisierung fehlgeschlagen!\n\n" +
                        "Mögliche Ursache.\nDie lfw2.ini Datei fehlt.\n\nWähle unter Einstellungen\\Laufwerke\\Ändern\ndas entsprechende Laufwerk aus und starte neu.\n");

                }
                catch (System.Exception f1)
                {
                    richTextBox1.Text = richTextBox1.Text + "\n" + f1.Message + "\n";
                }
                // ********************* Directory2 1*************************************************************************************************

                try
                {
                    string To_Directory = File.ReadAllLines(lfw2)[0];
                    DirectoryInfo Dir1 = new DirectoryInfo(From_Directory1);

                    if (!Dir1.Exists)
                    {
                        throw new Exception("Zielordner nicht vorhanden:" + From_Directory1);
                    }
                    if (!Directory.Exists(To_Directory + "\\Fahrzeugdaten" + " " + jahr.Year +"\\Alle Baureihen\\2"))
                    {
                        Directory.CreateDirectory(To_Directory + "\\Fahrzeugdaten" + " " + jahr.Year).CreateSubdirectory("Alle Baureihen\\2");
                    }
                    FileInfo[] files1 = Dir1.GetFiles();
                    foreach (FileInfo file in files1)
                    {
                        string Temppath = Path.Combine(To_Directory + "\\Fahrzeugdaten" + " " + DateTime.Now.Year + "\\Alle Baureihen\\2", file.Name);
                        try
                        {
                            file.CopyTo(Temppath);
                            progressBar1.Value = 20;
                            progressBar1.Update();
                            label1.Text = progressBar1.Value.ToString() + "%";
                            richTextBox2.Text = richTextBox2.Text + "\n" + file.FullName + "\n";

                        }
                        catch (System.IO.IOException ex1)
                        {
                            richTextBox1.Text = richTextBox1.Text + "\n" + ex1.Message + "\n";
                            progressBar1.Value = 20;
                            progressBar1.Update();
                            label1.Text = progressBar1.Value.ToString() + "%";
                        }
                        finally
                        {
                        }
                    }
                }
                catch (System.IO.FileNotFoundException)
                {
                    MessageBox.Show("! Initialisierung fehlgeschlagen!\n\n" +
                        "Mögliche Ursache.\nDie lfw2.ini Datei fehlt.\n\nWähle unter Einstellungen\\Laufwerke\\Ändern\ndas entsprechende Laufwerk aus und starte neu.\n");

                }
                catch (System.Exception f2)
                {
                    richTextBox1.Text = richTextBox1.Text + "\n" + f2.Message + "\n";
                    progressBar1.Value = 20;
                    progressBar1.Update();
                    label1.Text = progressBar1.Value.ToString() + "%";
                }

                // ********************* Directory3 usw. ..

    Samstag, 30. März 2019 07:26

Antworten

  • Hi Markus,
    für die Aktualisierung der Oberfläche sind durch das System Befehle abzuarbeiten, und zwar in dem Thread, indem die Oberflächenelemente "leben", d.h. erzeugt wurden. Das ist üblicherweise der UI-Thread. Wenn in diesen Thread aber langlaufende Programmstücke abgearbeitet werden, muss die Aktualisierung der Oberfläche warten, da die dafür auszuführenden Befehlsabschnitte erst abgearbeitet werden können, wenn der Thread in den Wartezustand geht. Aus diesen Gründen sind solche langlaufende Befehlsfolgen in einem separaten Thread abzuarbeiten.  Wenn aus diesem separaten Thread jedoch in den anderen Thread eingegriffen werden soll, dann geht das direkt nur, wenn die Objekt thread-sicher sind. Oberflächen-Elemente sind jedoch für Schreibvorgänge nicht threadsicher. Bei der Nutzung des BackgroundWorkers kann deshalb auch nicht direkt aus der DoWork-Ereignismethode auf nicht threadsichere Objekte eines anderen Thread zugegriffen werden.

    Wenn aus einem Thread auf nicht thread-sichere Objekte in einem anderen Thread zugegriffen werden soll, müssen spezielle Techniken genutzt werden. Die Idee dahinter ist, dass Programmabschnitte zur Verarbeitung in den andren Thread eingeordnet werde. Das kann mittels Invoke, Dispatcher oder Synchronization.Post realisiert werden.

    In Deinem Fall kann man im Button1_Click einen separaten Thread starten (z.B. mit dem BackgroundWorker) und daraus dann z.B. mir ProgressBar1.Invoke bzw. Label1.Invoke das Speichern von Value umleiten.



    --
    Viele Grüsse / Best Regards
    Peter Fleischer (former MVP for Developer Technologies)
    Homepage, Tipps, Tricks

    Samstag, 30. März 2019 13:54