Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > .NET Languages
You last visited: Today at 02:05

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Thread Problem

Discussion on Thread Problem within the .NET Languages forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Nov 2010
Posts: 700
Received Thanks: 507
Thread Problem

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 ?
supercracker13 is offline  
Old 07/08/2014, 17:55   #2
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
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.
Tasiro is offline  
Thanks
1 User
Old 07/10/2014, 15:48   #3
 
elite*gold: 0
Join Date: Jan 2014
Posts: 370
Received Thanks: 167
mach das ganze doch mit backgroundworker, der hat ein event completed
Onkelmat is offline  
Old 07/15/2014, 13:42   #4
 
G0dLesZ's Avatar
 
elite*gold: 0
Join Date: Feb 2006
Posts: 38
Received Thanks: 23
oder 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 an.


PS: Ab .NET 4.0 empfehle ich für Threading die (Task Parallel Library) zu verwenden ()
G0dLesZ is offline  
Old 07/15/2014, 18:21   #5
 
elite*gold: 0
Join Date: Nov 2010
Posts: 700
Received Thanks: 507
Hatte es schon gelöst. Auch mit einem ThreadPool.
Mache es zwar ein bisschen anders aber es funktioniert ^^
supercracker13 is offline  
Old 07/24/2014, 15:24   #6


 
KraHen's Avatar
 
elite*gold: 0
Join Date: Jul 2006
Posts: 2,216
Received Thanks: 794
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();

KraHen is offline  
Old 07/26/2014, 17:26   #7
 
elite*gold: 0
Join Date: Nov 2010
Posts: 700
Received Thanks: 507
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
supercracker13 is offline  
Old 07/26/2014, 19:31   #8


 
elite*gold: 1091
Join Date: Jun 2007
Posts: 19,836
Received Thanks: 7,180
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.
Mostey is offline  
Thanks
2 Users
Old 07/27/2014, 01:23   #9
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
And last but not least:
Quote:
Originally Posted by supercracker13
baddest
*scnr*
Schlüsselbein is offline  
Thanks
1 User
Reply




All times are GMT +1. The time now is 02:05.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.