Entwickler-Ecke
Basistechnologien - Rückgabewert von ParameterizedThreadStart
BlackMatrix - Fr 12.02.10 17:22
Titel: Rückgabewert von ParameterizedThreadStart
Hi
Wie erreiche ich, dass mir dieser Codeschnipsel einen Wert zurückliefert?
C#-Quelltext
1:
| Thread thread = new Thread(new ParameterizedThreadStart(Program.gethtml)); |
Kha - Fr 12.02.10 17:32
Ich glaube, die Theorie hinter asynchronen Abläufen ist dir noch nicht ganz klar. Wenn du an dieser Stelle auf einen Rückgabewert warten würdest, wäre der Hauptthread blockiert und du wärst effektiv wieder bei Singlethreading.
Was mit dem Ergebnis geschehen soll, musst du im Nebenthread entscheiden, also innerhalb von GetHtml. Bei einer Winforms-Anwendung würdest du beispielsweise per Control.Invoke wieder zum Hauptthread wechseln, um dort das Ergebnis anzuzeigen.
c#surfer - Fr 12.02.10 18:31
oder du verwendest den BackgroundWorker, da gibt es vorgefertigte Methoden (z.B. ProgressChanged) um dir den Status bzw. das Ergebnis mitteilen zu lassen.
BlackMatrix - Fr 12.02.10 21:51
Naja, jetzt wo du mich nochmal denken lassen hast, ist mir bewusst, dass es nicht gehen kann mit dem Rückgabewert von einem Thread.
Nur bin ich gerade bisschen überfordert. Und zwar liegt folgendes Problem vor, die Threads arbeiten in 95% der Fälle ganz normal, jedoch tritt in selten Fällen ein Ereignis ein auf das reagiert werden soll. Das Problem ist aber, dass bei dem Ereignis sofort alle Threads betroffen sind. Nun will ich aber, dass nur ein Thread (oder eben das Hauptprogramm) darauf reagiert.
Würde ich die Reaktion auf das Ereignis in gethtml reinschreiben, würden es alle Threads ausführen.
Kha - Fr 12.02.10 23:26
Huff, bis jetzt klingt das noch relativ nebulös ;) .
Wenn du auf dieses Ereignis sowieso im Hauptthread reagieren musst: Macht doch nichts aus, wenn Invoke mehrmals aufgerufen wird, im Hauptthread kannst du dann ein bool-Feld setzen, damit es wirklich nur einmal verarbeitet wird.
Wenns im Nebenthread sein soll, könnte es etwa so aussehen:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| int handled = 0;
...
if (Interlocked.Exchange(ref handled, 1) == 0) { } |
BlackMatrix - Fr 12.02.10 23:52
Geht das Control.Invoke auch bei einer Konsolenanwendung? Leider bin ich gerade bei so einer ;)
Kha - Fr 12.02.10 23:55
Nein, da wird es auch nicht gebraucht. Die Console-Befehle kann jeder Thread ausführen, nur sollte es nur einer auf einmal sein ;) .
Also wirst du über gewöhnliche Thread-Synchronisierung wie Interlocked gehen müssen.
BlackMatrix - Sa 13.02.10 00:01
Meinst du das so? Kann es leider nur schlecht testen, weil es so selten auftritt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| private static string threadsgethtml(object o_url) { if (ereignis==false) { int handled = 0; string url = (string)o_url; }else if (Interlocked.Exchange(ref handled, 1) == 0) { } } |
Kha - Sa 13.02.10 00:57
Damit da überhaupt Synchronisierung entstehen kann, muss handled ein Klassenfeld sein. Ich kann dir nur empfehlen, den Code mithilfe der Doku etc. wirklich zu verstehen. Ohne Handwerkszeug bist du bei Multithreading aufgeschmissen.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!