vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
NEU! sevCoolbar 3.0 - Professionelle Toolbars im modernen Design!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

C# Ecke
Asynchrones Programmieren / Threading 
Autor: reditec
Datum: 15.10.14 20:12

Hey!

Ich programmiere mal wieder.

Mittlerweile habe ich einen Teil des Programms der synchron ausgeführt wird und einen der asynchron ausgeführt wird, in einem neuen Thread.

Ich habe im synchronen Bereich eine Liste mit Daten, die alle einmal mit UploadValues hochgeladen werden sollen (asynchron).

Wie stelle ich es an, dass wenn alle Values hochgeladen sind (das kann ich prüfen) er mit dem nächsten Teil synchron fortfährt?

Denn ne 'if' wird da wohl kaum ausreichen, er ist ja noch nicht sofort fertig mit hochladen^^

Stelle mir davor so was wie ne leere while vor oder eine Art goto [zeile].

Ideen?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: Manfred X
Datum: 15.10.14 22:18

Hallo!

Wir haben kürzlich im VB-Forum eine ähnliche Frage diskutiert:
http://www.vbarchiv.net/forum/id10_i74110t74110_threadpool-beendigung-aller-threads-feststellen.html

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: Micke
Datum: 20.10.14 09:52

var threads = new List<Thread>();

threads.Add ( "alles reinstopfen" );

foreach(var each in threads) each.Start(); //bzw. den Start gleich vorm adden auslösen

foreach(var each in threads) each.Join();

/* der code landet erst in dieser Zeile wenn alle Threads durch sind */

Micke

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: powerzone3000
Datum: 20.10.14 13:01

Hallo,
wenn es um WebClient.UploadValues geht, kannst du dir das "händische" erstellen eines eigenen Threads sparen indem du UploadValuesAsync verwendest.

Den synchronen Teil kannst du dann aus dem UploadStringCompleted-Eventhandler anstoßen.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: reditec
Datum: 20.10.14 14:17

Das ist bis jetzt die für mich interessanteste Meethode
Ich rufe die Methode (damit ich sie mehrmals aufrufen kann, der Aufruf der Methode ist nämlich in einer Schleife) aktuell so auf:

read(dn, dp, dns, ver, link, updnec, dv, bitos, dnss, updnecls);
Und die Methode enthält das hier:


(new System.Threading.Thread(() =>
                        {
                            NameValueCollection myNameValueCollection = new _
                              NameValueCollection();
                            WebClient myWebClient = new WebClient();
                            string response = string.Empty;
                            bool prgAcc = new bool();
                            if (Environment.Is64BitOperatingSystem == true)
                            {
                                if (dnsss.Contains("Wow6432Node"))
                                {
                                    bitos = "x86";
 
                                }
 
                                else
                                {
                                    bitos = "x64";
                                }
                            }
                            else
                            {
                                bitos = "x86";
                            }
                            myNameValueCollection.Add("dn", dn + " " + bitos);
                            //MessageBox.Show(bitos);
                            byte[] responseArray = myWebClient.UploadValues( _
                              "http://comptalk.de/cms/iup/version.php", "POST", _
                              myNameValueCollection);
 
                            response = Encoding.ASCII.GetString(responseArray);
                            if (response != null)
                            {
                                ver.Add(response);
                                foreach (string dvss in dv)
                                {
                                    //MessageBox.Show("Wichtig:" + dvss);
                                    int dvsss = int.Parse(dvss.Replace(".", _
                                      ""));
 
                                    int dvsssss = int.Parse(response.Replace( _
                                      ".", ""));
 
                                    if (dvsss < dvsssss)
                                    {
                                        updnec.Add(dn);
                                        prgAcc = true;
                                        //MessageBox.Show("Zu UpdateNec wurde" & _
                                          "hinzugefügt:" + dvsss.ToString() + _
                                          "<" + dvsssss.ToString());
                                    }
                                    else
                                    {
                                        prgAcc = false;
                                        //MessageBox.Show("Zu UpdateNec wurde" & _
                                          "nicht hinzugefügt:" + dvsss.ToString( _
                                          ) + "<" + dvsssss.ToString());
                                    }
                                }
                            }
                            responseArray = myWebClient.UploadValues( _
                              "http://comptalk.de/cms/iup/link.php", "POST", _
                              myNameValueCollection);
                            string linkresponse = Encoding.ASCII.GetString( _
                            responseArray);
                            if (linkresponse != null)
                            {
 
                                if (prgAcc == true)
                                {
                                    link.Add(linkresponse);
                                }
                            }
 
                        })).Start();
Ich kann mir nicht ganz vorstellen, wie ich das mit Threads.Add verbinden kann...
hört sich so an, als müsste ich da den Code aus der Funktion reinschreiben oder wie?
Ein ganz kurzes Beispiel aus diesem Bereich wäre 1A oder nen guter Link, denn bei MSDN suche ich schon seit Tagen
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: Micke
Datum: 20.10.14 15:24

deine Anfangszeile "new System.Threading.Thread" erzeugt ja einen thread, welchen du dann in die Liste in meinem snippet stecken könntest.

was an deinem code ungünstig ist, daß in deinem thread auch immer wieder code ausgeführt wird, welcher 1x reichen würde.
bspw. ist "myWebClient.UploadValues" das dynamische, die x64 Umgebung wird sich sicher nicht ständig ändern.
die zwei "myWebClient.UploadValues" können m.M.n. auch losgelöst voneinander bearbeitet werden.

räum mal auf, dann springt dir die Lsg. vermutlich selbst ins gesicht. oder du kommst mit dem neuen code nochmal wieder

Micke

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: reditec
Datum: 20.10.14 16:05

Das ein Thread erzeugt wird ist mir klar. xD
Aber wie packe ich den in dein Snippet? Hat der nen Namen?
(Der Thread - Aufruf Code ist aus nem anderen Forum (deshalb bin ich mir bei dem nicht 100%ig sicher ob der stimmt )

Nein. Das muss so sein. Der kriegt immer andere Werte. Bitte geh einfach davon aus, dass es so richtig ist.
Das wird eine Art Updater für mehrere Programme, der muss das so ausführen. Ich weiß wirklich welche Stelle du meinst, aber es macht einfach bei meinem jetzigen Code keinen Sinn.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: powerzone3000
Datum: 20.10.14 16:26

Wenn ihr mich fragt, passt Micke's Beispiel in diesem Fall nicht ganz.
- Erstens macht die List(Of Thread) bei einem einzelnen Thread keinen Sinn (war aber ohne Beispielcode auch nicht vorherzusehen)
- Zweitens wird der UI-Thread durch das Thread.Join() solange blockiert, bis der Thread abgeschlossen ist. Dann hätte man es auch gleich im UI-Thread machen können

Anderer Vorschlag: Wie wäre es mit mit einem BackgroundWorker? Wenn das RunWorkerCompleted-Event ausgelöst wird weißt du, dass der Thread fertig ist.

Beitrag wurde zuletzt am 20.10.14 um 16:27:13 editiert.
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: reditec
Datum: 20.10.14 17:44

Beim BackgroundWoker besteht das PRoblem, dass ich nicht wissen will wann dieser eine BackgroundWorker fertig ist, sondern wann alle anderen fertig sind. Außerdem weiß ich nicht wie viele BackgroundWorker ich brauche, einer alleine ist ja von einem Upload schon augelastet^^
Gibt's da sowas wie ne Queue?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: Micke
Datum: 20.10.14 19:05

aso, das
(new System.Threading.Thread(() =>  ... )
ändern in:

var list = new List<Thread>();
list.Add ( new System.Threading.Thread(() => ... ) )

b)
daß sich die url's ändern habe ich gesehen, das würde nicht dagegen sprechen. war nur laut gedacht.

die Anregung von powerzone3000 ist aber berechtigt. die klassische Thread Klasse hier beherrscht zwar auch den ereignisgesteuerten Rücksprung, in GUI's ist der backgroundworker aber vermutlich bequemer. der grundsätzliche code dürfte aber gleichbleiben, sodaß man notfalls bisl spielen kann.

Micke

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: Micke
Datum: 20.10.14 19:07

du könntest ja in der rücksprungfunktion schauen, ob's der letzte thread war, das wäre nicht das Problem.
ist einfach die frage was man braucht.

Micke

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: reditec
Datum: 20.10.14 19:23

Was ist die Rücksprungfunktion?
Hört sich für mich grade so an, als wär das der Schlüssel, der mir fehlt
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: Micke
Datum: 23.10.14 12:51

mit Rücksprungfunktion meine ich diejenige, die du z.b. im Event RunWorkerCompleted des Backgroundworker registrierst.
damit läuft die Abarbeitung aber vollständig asynchron und läßt sich auch nicht mehr in den Haupthread reinholen. Was nichts schlechtes ist, du hattest aber als Vorgabe geschrieben:

"Wie stelle ich es an, dass wenn alle Values hochgeladen sind (das kann ich prüfen) er mit dem nächsten Teil synchron fortfährt? "

Micke

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: reditec
Datum: 23.10.14 13:44

Sorry, ich habe wie gesagt bis jetzt fast noch nie mit dem BGWorker gearbeitet.
Was meinst du mit registrieren?

Heißt das, dass auch diese Möglichkeit mir nicht weiter hilft?
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: Micke
Datum: 23.10.14 14:37

wenn man ein Event abonniert, registriert man eine Funktion, welche dann bei auslösen des Events aufgerufen wird. das selbst ist noch nichts thread, async oder BGW spezifisches

Micke

Beitrag wurde zuletzt am 23.10.14 um 14:38:12 editiert.

Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Re: Asynchrones Programmieren / Threading 
Autor: reditec
Datum: 23.10.14 17:05

Okey. Also kann ich gucken von welcher Thread den BGWorker ausgelöst hat.
Was nützt mir das? O.o
Themenbaum einblendenGesamtübersicht  |  Zum Thema  |  Suchen

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel