Frage von X2ToP, 19

C# Programmstop (lagg) verhindern oder mit Loadingscreen tarnen?

Hallo liebe Com, ich habe ein C# Programm geschrieben, wo man u.A. E-Mails verschicken kann. Zu mein Problem: Wenn ich eine E-Mail verschicke, also auf den Button klicke, hängt das Programm einige Sekunden. Habe auch schon iwelche gifs etc. eingebaut, die vor der Aktion auftreten sollen und nach der Aktion verschwinden sollen, welches garnicht hilft, da diese sich auch aufhängen. Gibt es eine andere Möglichkeit? Wie machen das alle anderen Programme? Ich habe diesen einfachen Code z.B. verwendet:

loadingpanel.Visible = true;
            MailMessage mail = new MailMessage();
            mail.From = new MailAddress("-----------"); //programm 
            mail.To.Add("---------------"); //ich
            mail.Subject = "----------------";
            mail.Body = "-------------------";

            SmtpClient client = new SmtpClient("-----------", 25);//server

            try
            {
                client.Credentials = new System.Net.NetworkCredential("-----------------", "---------------");//anmelden

                client.EnableSsl = true; //ssl 

                client.Send(mail); //Senden 
            }
            catch
            {

            }
            loadingpanel.Visible = false;
Antwort
von regex9, 11

Ja, das Eröffnen einer Verbindung zu einem SMTP-Server kostet etwas Zeit. Um das Performance-Problem auszulagern, gibt es aber mehrere mögliche Alternativen:

  • Asynchrones Senden (https://msdn.microsoft.com/de-de/library/x5x13z6h(v=vs.110).aspx)
  • Senden der Nachricht via Thread
  • Eine Queue. Bspw. könnten neue Nachrichten erst einmal nur in einem Ordner zwischengespeichert und später verschickt werden. Ist im Prinzip auch asynchron.
Antwort
von Berny96, 19

Erledige das doch in einem neuen Thread. Man sollte solche Sachen so oder so nicht im GUI Thread machen eben weil die ganze Oberfläche sonst stehen bleibt bis es fertig ist.

Thread emailThread = new Thread(new ThreadStart(SendEmail));
emailThread.Start();

public void SendEmail(){
// email versenden
}
Kommentar von X2ToP ,

Problem gelöst. Danke! :) Kann ich jetzt auch irgendwie abfangen, wann der Vorgang abgeschlossen ist? Einfach am Ende des public voids dann ladescreen beenden und benachrichtigen dass es erfolgreich war oder gibt es da eine andere Methode?

Kommentar von Berny96 ,

Dein Ansatz würde auf jeden Fall funktionieren. Alternativ gäb es noch die Möglichkeit eine Funktion als "Callback" anzuhängen der aufgerufen wird sobald der Thread fertig ist. So wäre es technisch eher "richtig" und der entsprechende Code wird nicht ausgeführt wenn im Thread ein Fehler auftritt. Den Callback muss man an den Threadstart hängen:

ThreadStart emailStarter = new ThreadStart(SendEmail);
emailStarter += () => {
 // der Thread ist fertig und alles lief super
 // was passiert nun?
}
Thread emailThread = new Thread(emailStarter);
emailThread.Start();

Keine passende Antwort gefunden?

Fragen Sie die Community