| |
C# EckeAsynchrones 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? | |
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 | |
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. | |
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 | |
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. | |
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. | |
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? | |
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 | |
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 | |
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 | |
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 | |
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? | |
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. | |
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 | |
| 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 |
|
|
Neu! sevPopUp 2.0
Dynamische Kontextmenüs!
Erstellen Sie mit nur wenigen Zeilen Code Kontextmenüs dynamisch zur Laufzeit. Vordefinierte Styles (XP, Office, OfficeXP, Vista oder Windows 8) erleichtern die Anpassung an die eigenen Anwendung... Weitere InfosTipp des Monats TOP Entwickler-Paket
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1605.50 EUR...
Jetzt nur 599,00 EURWeitere Infos
|