Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Fr 12.02.10 17:22 
Hi

Wie erreiche ich, dass mir dieser Codeschnipsel einen Wert zurückliefert?
ausblenden C#-Quelltext
1:
                    Thread thread = new Thread(new ParameterizedThreadStart(Program.gethtml));					
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 42
Erhaltene Danke: 2



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
int handled = 0;

...

// Ereignis aufgetreten
if (Interlocked.Exchange(ref handled, 1) == 0) {
  // Juhu, erster!
}

_________________
>λ=
BlackMatrix Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Sa 13.02.10 00:01 
Meinst du das so? Kann es leider nur schlecht testen, weil es so selten auftritt:
ausblenden 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;
            //3x gethtml
}else
                if (Interlocked.Exchange(ref handled, 1) == 0
                {
                    //hier reagieren? Und hier geht dann maximal ein thread rein?
                }
            
        }
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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.

_________________
>λ=