Thread Problem

07/08/2014 11:58 supercracker13#1
Hallo ich habe ein kleines Problem mit den Threads ^^

Ich habe mal das Programm einfach zusammen gefasst und den Code geschrieben

PHP Code:
        public void Test()
        {
            
string[] teststring = new string[] { "Nummer1""Nummer2""Nummer3""Nummer4""Nummer5" };
            List<
Threadtdlist = new List<Thread>();
            for (
int i 03i++)
            {
                
tdlist.Add(new Thread(() => dowork(teststring[i])));
                
Console.WriteLine("Sollte ankommen: " teststring[i]);
                
tdlist[i].Start();
            }
        }

        
void dowork(string val)
        {
            
Thread.Sleep(new Random().Next(200010000));
            
Console.WriteLine("Kommt an: " val);
        } 
Es gibt ein Array, hier "teststring" und 3 Threads werden erstellt.
Auf diese 3 Threads sollen die Strings aufgeteilt werden.
Also festgelegt ist das der erste Thread den ersten string bekomt und so weiter. Aber danach soll der Thread der als erstes fertig ist den nächsten String bekommen. Ich habe es auch schon mit Thread.Join() probiert aber das Problem ist immer das damit nur ein Thread überwacht wird.

Zusätztlich kam das Problem daszu das bei den Code daoben die Ausgabe jetzt immer das selbe ist also bei dowork wird immer das selbe ausgegeben.
Wisst ihr zufällig was ich falsch mache ?
07/08/2014 16:55 Tasiro#2
Quote:
Originally Posted by supercracker13 View Post
Zusätztlich kam das Problem daszu das bei den Code daoben die Ausgabe jetzt immer das selbe ist also bei dowork wird immer das selbe ausgegeben.
Es wird keine (lokale) Kopie von i im Lambda referenziert, sondern direkt i. Das heißt, dass bis dahin das Programm z. B. folgendes tun könnte:
1. Das Erstellen von Thread eins, zwei und drei an Windows wird an Windows gemeldet, derweil wird i inkrementiert.
2. Thread zwei wurde gestartet und greift auf i zu. Das Auswerten von i ergibt den Wert 4. Dieser wird dann verwendet.
Du kannst direkt vor der Zeile mit dem Lambda ein var copy = i; einfügen und dann die Kopie verwenden, wie du es erwartest.
Wenn du eine foreach-Schleife verwendest, erhälst du ebenfalls das erwartete Verhalten.


Was du scheinbar zu erstellen versuchst, ist eine Art Thread Pool. Sofern nicht zu Lehrzwecken, solltest du versuchen, das bereits Vorhandene zu verwenden, wie z. B. die TPL.
Intern wird in der Regel eine Liste von durchzuführenden Aufgaben unterhalten, von welcher sich jeder Arbeits-Thread bedient.
07/10/2014 14:48 Onkelmat#3
mach das ganze doch mit backgroundworker, der hat ein event completed
07/15/2014 12:42 G0dLesZ#4
[Only registered and activated users can see links. Click Here To Register...] oder [Only registered and activated users can see links. Click Here To Register...] für die Aufgaben (in deinem Fall Liste von Zeichenketten) verwenden.

Pseudo Beispiel:
Code:
var queue = new Queue<string>{ "s1", "s2", "s3" };
while (queue.Count > 0) 
{
    var item = queue.Pop();
}
Für die Verwaltung der Threads verwendest Du dann einen Pool von Threads.
Hier bietet sich der [Only registered and activated users can see links. Click Here To Register...] an.


PS: Ab .NET 4.0 empfehle ich für Threading die [Only registered and activated users can see links. Click Here To Register...] (Task Parallel Library) zu verwenden ([Only registered and activated users can see links. Click Here To Register...])
07/15/2014 17:21 supercracker13#5
Hatte es schon gelöst. Auch mit einem ThreadPool.
Mache es zwar ein bisschen anders aber es funktioniert ^^
07/24/2014 14:24 KraHen#6
TBH I don`t know any german and I don`t know what you`re asking but if you`re using threads like this it`s generally a good idea to join them. So after your first loop you`d do

PHP Code:
for (int i 0tdlist.Lengthi++) 

     
tdlist[i].Join();

07/26/2014 16:26 supercracker13#7
Your answer is one of the baddest i ever got.

1: I solved the problem allready.
2: If you dont know the question, dont answer
3: you code does nearly the same thing like my code, there is just the lenght of the list instead a static number
07/26/2014 18:31 Mostey#8
Quote:
Originally Posted by supercracker13 View Post
1: I solved the problem allready.
How is he supposed to know that if he doesn't speak German at all?

Quote:
Originally Posted by supercracker13 View Post
2: If you dont know the question, dont answer
While this is partially true, you should appreciate his answer since he took time to help you and not to disturb you.

Quote:
Originally Posted by supercracker13 View Post
3: you code does nearly the same thing like my code, there is just the lenght of the list instead a static number
That's wrong, his code is joining the threads instead of starting them, as your code does.
07/27/2014 00:23 Schlüsselbein#9
And last but not least:
Quote:
Originally Posted by supercracker13
baddest
*scnr*