Benutzer mit den meisten Antworten
Backgroundworker Probleme wegen anderem Thread

Frage
-
Hallo zusammen,
in meinem Programm versende ich Mails, die teilweise große Anhänge haben. Während des Sendens "pausiert" das Programm. Ein klassischer Fall für einen Backgroundworker, denke ich.
Nachdem ich mir verschiedene Dinge dazu angelesen und Videos gesehen habe, ist mir so weit klar, dass ich das, was momentan über das ButtonClick-Event ausgelöst wird der Teil ist, der mein Programm bremst und daher in den Backgroundworker gehört.
Ich habe den Code daher 1:1 in eine Sub Tuwas() verschoben,
dem Backgroundworker1_DoWork Event den Call Tuwas() Aufruf hinzugefügt und
dem Button, der bislang den Sendevorgang startete den Befehl "BackgroundWorker1.RundWorkerAsync()
hinzugefügt und bekomme nun die Meldung, dass ich einen ujnzulässigen threadübergreifenden Vorgang initiiere.Mache ich einen Denkfehler, ist nicht genau das der Trick beim Backgroundworker?
Der Hilfelink führt mich auf eine ungültige Seite die mich mehr oder minder auffordert auf der MSDN-Website zu suchen.
Habt Ihr einen Lösungsvorschlag der keine weiteren Stunden Internetrecherche erfordert?
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 and VB 2010 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful. c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/
Antworten
-
Hallo Stefan,
Du willst eine TextBox aus einem anderen Thread heraus manipulieren, daher kommt diese Fehlermeldung.
Schau dir mal diesen MSDN Artikel an:
https://msdn.microsoft.com/de-de/library/ms171728.aspx
Für dich insbesondere interessant ist die dort gezeigte Methode "SetText" und der dort verwendete Delegate "SetTextCallback".
Das musst Du bei dir für alle Controls nachbauen, die Du aus dem BackgroundWorker heraus ansprichst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Giftzwockel Mittwoch, 4. März 2015 16:48
-
Hallo Stefan,
die Datei, die eh nur aus wenigen Zeilen besteht, würde ich zuerst im GUI-Thread erstellen, schon alleine deswegen, weil sonst das Risiko besteht, dass sich der Inhalt einer der Textboxen ändert, weil jemand schnell tippt.
Und nur das Senden der Mail in einen BackgroundWorker zu verlagern oder aber SmtpClient.SendAsync zu verwenden. Da dabei nur auf die Datei zugegriffen wird, gibt es keine Probleme mehr mit threadübergreifenden GUI Zugriffen.
Gruß Elmar
- Als Antwort markiert Giftzwockel Mittwoch, 4. März 2015 16:48
-
Hallo Stefan,
damit der BackgroundWorker das Ereignis auslöst muss die WorkerReportsProgress Eigenschaft auf Wahr gesetzt werden - entsprechendes gilt für das Abbrechen mit WorkerSupportsCancellation.
Aber auch in Deinem obigen Code greifst Du auf GUI zu (ToolStripStatusLabel5.Text). Du solltest den Code ins ReportProgress Ereignis verlegen. Wobei es sich mir derzeit nicht erschließt, was die Schleife da soll. Einfacher wäre es einfach den Wert von Upload.Value zu erhöhen.
Gruß Elmar
- Als Antwort markiert Giftzwockel Mittwoch, 4. März 2015 16:43
Alle Antworten
-
Hallo Stefan,
Du willst eine TextBox aus einem anderen Thread heraus manipulieren, daher kommt diese Fehlermeldung.
Schau dir mal diesen MSDN Artikel an:
https://msdn.microsoft.com/de-de/library/ms171728.aspx
Für dich insbesondere interessant ist die dort gezeigte Methode "SetText" und der dort verwendete Delegate "SetTextCallback".
Das musst Du bei dir für alle Controls nachbauen, die Du aus dem BackgroundWorker heraus ansprichst.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Giftzwockel Mittwoch, 4. März 2015 16:48
-
Hallo Stefan,
das scheint mir auf den ersten Blick nicht ganz trivial zu sein.
Da muss ich aber scheinbar durch. Danke erst mal.Ich habe das Beispiel eben mal kopiert und testen wollen, da trat aber auch ein Fehler auf.
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 and VB 2010 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful. c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/
-
Hallo Stefan,
die Datei, die eh nur aus wenigen Zeilen besteht, würde ich zuerst im GUI-Thread erstellen, schon alleine deswegen, weil sonst das Risiko besteht, dass sich der Inhalt einer der Textboxen ändert, weil jemand schnell tippt.
Und nur das Senden der Mail in einen BackgroundWorker zu verlagern oder aber SmtpClient.SendAsync zu verwenden. Da dabei nur auf die Datei zugegriffen wird, gibt es keine Probleme mehr mit threadübergreifenden GUI Zugriffen.
Gruß Elmar
- Als Antwort markiert Giftzwockel Mittwoch, 4. März 2015 16:48
-
Hallo Elmar,
ich habe bestimmt zwei Jahre lang nichts mehr programmiert und bin jetzt dabei mich in meinen recht umfangreichen Code wieder einzulesen. Der war damals sehr chaotisch (kanns halt nicht besser).
Einiges habe ich jetzt mit einem Bruchteil des alten Quellcodes hinbekommen was hoffentlich zeigt, dass ich auf dem richtigen Weg bin. Mein eigentliche Problem ist, dass ich in einer ProgressBar den Fortschritt angezeigt bekomme.
Sub ProgBar() Dim intI, intC As Integer Dim intI2, intC2 As Integer Dim strTemp As String = "" Dim dblProgress As Double intC = 100 intC2 = CDbl(ToolStripStatusLabel5.Text) For intI = 0 To intC - 1 For intI2 = 0 To intC2 - 1 strTemp = strTemp & "a" Next dblProgress = (intI + 1) * 100 / (intC) BackgroundWorker1.ReportProgress(dblProgress) Next End Sub
Ich habe nun ein Beispiel aus einem Video nachgebaut (funktioniert) und nun den versuch unternommen, diesen funktionierenden Code in mein Programm zu übernehmen.Private Sub BackgroundWorker1_DoWork_1(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork Call ProgBar() End Sub
Private Sub BackgroundWorker1_ProgressChanged(sender As System.Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged Upload.Value = e.ProgressPercentage End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted_1(sender As System.Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted MsgBox("OK") End Sub
Was in dem kleinen Testprogramm lief scheitert jetzt daran, dass mir die Meldung ausgegeben wird:
Dieser BackgroundWorker gibt an, dass er keinen Fortschritt meldet. Ändern Sie WorkerReportsProgress, um anzugeben, dass er einen Fortschritt meldet.
Was ist denn nun anders oder falsch??
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 and VB 2010 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful. c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/
-
Hallo Stefan,
damit der BackgroundWorker das Ereignis auslöst muss die WorkerReportsProgress Eigenschaft auf Wahr gesetzt werden - entsprechendes gilt für das Abbrechen mit WorkerSupportsCancellation.
Aber auch in Deinem obigen Code greifst Du auf GUI zu (ToolStripStatusLabel5.Text). Du solltest den Code ins ReportProgress Ereignis verlegen. Wobei es sich mir derzeit nicht erschließt, was die Schleife da soll. Einfacher wäre es einfach den Wert von Upload.Value zu erhöhen.
Gruß Elmar
- Als Antwort markiert Giftzwockel Mittwoch, 4. März 2015 16:43
-
Hallo Elmar,
erst mal danke, ich habe jetzt ein funktionierendes Programm.
Das WorkerReportsProgress Eigenschaft auf Wahr gesetzt werden muss, war im Demovideo auch ausrücklich beton worden.
Sie Schleife habe ich erst mal nur abgetippt damit ich einen Erfolg verbuchen kann. Bei meinem früheren Versuch den Upload.Value zu erhöhen bin ich gescheitert. Bei 70% war Ende ohne das ich dafür einen Grund hätte erkennen können. Egal ob ich mit If then oder einer While End While Funktion gearbeitet habe.Ich hoffe, dass ich ab hier aufgrund Eurer Tipps jetzt wieder alleine weiter komme.
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 and VB 2010 Express Be a good forum member - mark posts that contain the answers to your questions or those that are helpful. c# in vb Translator: http://www.developerfusion.com/tools/convert/csharp-to-vb/