| Autor |
Beitrag |
BlackMatrix
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 12.02.10 17:22
Hi
Wie erreiche ich, dass mir dieser Codeschnipsel einen Wert zurückliefert?
C#-Quelltext 1:
| Thread thread = new Thread(new ParameterizedThreadStart(Program.gethtml)); |
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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
      
Beiträge: 42
Erhaltene Danke: 2
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: Fr 12.02.10 23:52
Geht das Control.Invoke auch bei einer Konsolenanwendung? Leider bin ich gerade bei so einer 
Zuletzt bearbeitet von BlackMatrix am Sa 13.02.10 00:01, insgesamt 2-mal bearbeitet
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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 
      
Beiträge: 243
Erhaltene Danke: 1
|
Verfasst: 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
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: 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.
_________________ >λ=
|
|