myCSharp.de - DIE C# und .NET Community
Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 
 | Suche | FAQ

» Hauptmenü
myCSharp.de
» Startseite
» Forum
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Suche
» Regeln
» Wie poste ich richtig?
» Forum-FAQ

Mitglieder
» Liste / Suche
» Wer ist wo online?

Ressourcen
» openbook: Visual C#
» openbook: OO
» Microsoft Docs

Team
» Kontakt
» Übersicht
» Wir über uns

» myCSharp.de Diskussionsforum
Du befindest Dich hier: Community-Index » Diskussionsforum » Entwicklung » GUI: Windows-Forms » Wie kann ich ein Einfrieren meiner UI vermeiden?
Letzter Beitrag | Erster ungelesener Beitrag Druckvorschau | Thema zu Favoriten hinzufügen

Antwort erstellen
Zum Ende der Seite springen  

Wie kann ich ein Einfrieren meiner UI vermeiden?

 
Autor
Beitrag « Vorheriges Thema | Nächstes Thema »
SKB SKB ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.10.2020
Beiträge: 6


SKB ist offline

Wie kann ich ein Einfrieren meiner UI vermeiden?

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Hallo,
ich hätte eine Frage zu einer kleinen Anwendung, die ich aktuell erstelle.

Sie liest die Mails von einem Exchange Server ein, wertet den Body aus und postet dann die Daten an ein PHP Skript auf einem anderen Server. dies geschieht via Timer jede Minute und kann auch manuell per Button ausgelöst werden.

Soweit, so gut.

Wenn nun die Abarbeitung der Mails beginnt, blockiert irgendwie meine UI - ich muss zugeben, mit den Tasks habe ich mich nie groß beschäftigen müssen. Jetzt liegt es wohl auf der Hand.

Kann mir vielleicht jemand etwas unter die Arme greifen, wie ich gleichzeitig die UI bedienbar halte und im Hintergrund die Mails einlese und auch Aktualisierungen an die UI bringe?

Folgender Code friert die UI ein:

C#-Code:
        // Button für Manuell
        private void btnManuell_Click(object sender, EventArgs e)
        {
            timer1.Stop();
            FetchNewMail(sender, e);
        }
        public async void FetchNewMail(object sender, EventArgs e)
        {
            if (exchange != null)
            {
                // Display Info, that messages are being fetches
                rBFailure.Text = "Emails werden bearbeitet!";
                FolderId SharedMailbox = new FolderId(WellKnownFolderName.Inbox, g_id);
                SearchFilter searchFilter = new SearchFilter.SearchFilterCollection(LogicalOperator.And, new SearchFilter.IsEqualTo(EmailMessageSchema.IsRead, false));

                PropertySet FindItemPropertySet = new PropertySet(BasePropertySet.IdOnly);

                ItemView view = new ItemView(999);
                view.PropertySet = FindItemPropertySet;
                PropertySet GetItemsPropertySet = new PropertySet(BasePropertySet.FirstClassProperties);
                GetItemsPropertySet.RequestedBodyType = BodyType.Text;


                FindItemsResults<Item> emailMessages = null;
                do
                {
                    emailMessages = exchange.FindItems(SharedMailbox, searchFilter, view);
                    if (emailMessages.Items.Count > 0)
                    {
                        int tmp_i = 0;
                        int tmp_message_counter = emailMessages.Items.Count;
                        lblMailCountText.Text = tmp_message_counter.ToString();
                        exchange.LoadPropertiesForItems(emailMessages.Items, GetItemsPropertySet);
                        foreach (Item Item in emailMessages.Items)
                        {
                            tmp_i++;
                            rBFailure.Text = "Bearbeite Nachricht " + tmp_i.ToString() + " von " + tmp_message_counter.ToString();
                            //rBFailure.Text = Item.Body.Text;
                            // Send the Data to the Server and
                            // Wenn ich dies auskommentiere, läuft das Skript relativ schnell durch
                            if (await postnewDataAsync(Item.Body.Text, "test"))
                            {
                                // Refresh the Numbers
                                worked_mails++;
                                lblMailCountWorkText.Text = worked_mails.ToString();
                                lblMailCountWorkText.Refresh();

                                // Mark the Mail as read
                                //MarkAsReadAndMove(Item.Id);
                            }
                            else
                            {
                                // Refresh the Numbers
                                failed_mails++;
                                lblMailCountFailedText.Text = failed_mails.ToString();
                                lblMailCountFailedText.Refresh();
                            }
                        }
                        rBFailure.Text = "Alle Nachrichten wurden bearbeitet!";
                        rBFailure.Refresh();
                        lblMailCountText.Text = "0";
                        lblMailCountText.Refresh();
                    }
                } while (emailMessages.MoreAvailable);

                if (emailMessages.Items.Count <= 0)
                {
                    rBFailure.Text = "Aktuell keine neuen Nachrichten!";
                    lblMailCountText.Text = "0";
                    lblMailCountText.Refresh();
                }
            }
            // Reset the Timer
            counter = 60;
            StartTimer();
            // Reset the ProgressBar
            pgTimer.Value = 60;
        }
        private async Task<bool> postnewDataAsync(string data, string action)
        {
            var values = new Dictionary<string, string>
            {
                { "action", action },
                { "data", data }
            };

            var content = new FormUrlEncodedContent(values);

            var response = await client.PostAsync("Skript.php", content);

            var responseString = await response.Content.ReadAsStringAsync();
            if (responseString.Contains("Erfolg"))
            {
                return true;
            } else
            {
                return false;
            }
        }

Vielen Dank!
Neuer Beitrag 15.10.2020 20:15 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
T-Virus T-Virus ist männlich
myCSharp.de-Mitglied

Dabei seit: 17.04.2008
Beiträge: 1.661
Entwicklungsumgebung: Visual Studio, Codeblocks, Edi
Herkunft: Nordhausen, Nörten-Hardenberg


T-Virus ist offline Füge T-Virus Deiner Kontaktliste hinzu

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Liegt auch daran, dass die FetchNewMail komplett synchron ausgeführt wird.
Dort läuft deine Schleife synchron, weshalb auch deine UI einfriet.
Lediglich dein Aufruf von postnewDataAsync kann asynchron laufen.
Du solltest dich in Tasks einlesen, wenn du schon asychrone Prozesse nutzen willst.

T-Virus
Neuer Beitrag 15.10.2020 21:43 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
SKB SKB ist männlich
myCSharp.de-Mitglied

Dabei seit: 15.10.2020
Beiträge: 6

Themenstarter Thema begonnen von SKB

SKB ist offline

Beitrag: beantworten | zitieren | editieren | melden/löschen       | Top

Danke, ich habe es soweit mit Tasks umgestellt ;)
Neuer Beitrag 18.10.2020 10:49 E-Mail | Beiträge des Benutzers | zu Buddylist hinzufügen
Baumstruktur | Brettstruktur       | Top 
myCSharp.de | Forum Der Startbeitrag ist älter als ein Monat.
Der letzte Beitrag ist älter als ein Monat.
Antwort erstellen


© Copyright 2003-2020 myCSharp.de-Team | Impressum | Datenschutz | Alle Rechte vorbehalten. | Dieses Portal verwendet zum korrekten Betrieb Cookies. 05.12.2020 23:19