BigBastis Blog

C#: Threads mit Parametern Starten

Introduction

user

Sebastian Gross

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.


LATEST POSTS

Handling too long scrollspy menus 10th June, 2015

Java: Create ZIP archive 23rd March, 2015

.NET

C#: Threads mit Parametern Starten

Posted on .

Wenn ihr auch mal mit Threads gearbeitet habt habt ihr sicherlich auch schon festgestellt, dass es zu Problemen kommt, wenn man einen Thread starten möchte und diesem auch noch Parameter unterjubeln will.

Ein normaler(einfacher) Threadstart sieht ja folgendermaßen aus:

public class test {
    public test() {
        Auto a = new Auto();

        Thread t = new Thread(new ThreadStart(a.Fahre));
    }
}

public class Auto {
    public void Fahre(){
        //...
    }
}

Aber was ist wenn wir nun dem Auto auch sagen sollen wie weit es fahren soll? Also so:

public class test {
    public test() {
        Auto a = new Auto();

        Thread t = new Thread(new ThreadStart(a.Fahre(100)));
    }
}

public class Auto {
    public void Fahre(){
        //...
    }

    public void Fahre(int wieWeit) {
        //...
    }
}

Leider geht das nicht so einfach, da ThreadStart einen Methodennamen erwartet. Hier müssen wir also anders ansetzen. Eine Möglichkeit dieses Problem zu lösen bzw. zu umgehen ist es die Klasse Auto etwas zu modifizieren und die Parameter, die wir eigentlich über den Methodenaufruf übergeben wollten über den Konstruktor zu übergeben (oder über Properties zu setzen). Somit wäre die Fahre Methode wieder frei von Parametern und könnte problemlos über ThreadStart aufgerufen werden:

public class test {
    public test() {
        Auto a = new Auto(100);

        Thread t = new Thread(new ThreadStart(a.Fahre));
    }
}

public class Auto {
    private int wieWeit;

    public Auto(int wieWeit) {
        this.wieWeit = wieWeit;
    }

    public void Fahre(){
        //... hier kann man mit dem Wert
        // von wieWeit arbeiten
    }
}

Aber diese „Lösung“ ist natürlich auch nicht das Gelbe vom Ei. Deswegen habe ich noch ein wenig gegoogelt und habe eine sehr schöne und zugleich einfache Lösung entdeckt:

    public class test {
        public test() {
            Auto a = new Auto();

            ThreadStart start = delegate { a.Fahre(100); };
            Thread t = new Thread(new ThreadStart(start));
        }
    }

    public class Auto {

        public void Fahre(int wieWeit) {
            //...
        }
    }

Hier machen wir von den Anonymen Methoden Gebrauch (siehe Zeile 5) und packen die in ein Delegate, das wir dann dem ThreadStart übergeben. Hier können wir auch bequem unseren Parameter mit angeben und müssen somit auch nicht an der Klasse selbst Änderungen vornehmen.

Kleiner Nachtrag noch:
Maximilian hat mich grad noch an das ParameterizedThreadStart Delegate aufmerksam gemacht, das habe ich noch unbewusst ausgelassen :). Dieses bietet ebenfalls eine angenehme Möglichkeit Parameter an Threads zu übergeben, hier auch dazu ein kleines Beispiel:

public class test {
    public test() {
        Auto a = new Auto();

        Thread t = new Thread(new ParameterizedThreadStart(a.Fahre));
        t.Start(100);
    }
}

public class Auto {

    public  void Fahre(object wieWeit) {
        //...
    }
}

Man beachte hierbei, dass der Typ des Parameters nun Object ist (Zeile 12) deswegen muss vor der Verwendung noch ein Cast stattfinden. Außerdem könnte man Probleme bekommen, wenn man Überladungen benutzen will.

Das ganze ist natürlich nichts weltbewegendes, aber da ich es noch nicht kannte habe ich es hier mal mit aufgenommen.
kick it on dotnet-kicks.de

profile

Sebastian Gross

http://www.bigbasti.com

Sebastian Gross arbeitet in Bielefeld als Softwareentwickler für .NET und Java im Bereich Web.Als Fan der .NET-Plattform lässt er sich kein Userguppen Treffen und Community Event im Raum OWL entgehen.Dabei hat er eine besondere Vorliebe für das ASP.NET MVC Framework und für das Test Driven Development (TDD) entwickelt.

Comments
user

Author bigbasti87

Posted at 09:42 7. Dezember 2010.

Bloggd: C#: Threads mit Parametern Starten – http://blog.bigbasti.com/c-threads-mit-p

user

Author Maximilian

Posted at 10:54 7. Dezember 2010.

Oder einfach das dafür vorgesehene Delegate ParameterizedThreadStart verwenden 😉
http://msdn.microsoft.com/de-de/library/system.threading.parameterizedthreadstart%28VS.80%29.aspx

Gruß,
Maximilian

user

Author A. Schirmer

Posted at 17:05 7. Dezember 2010.

Guter Hinweis. Demzufolge geht auch:
Thread t = new Thread(() => a.Fahre(100));
t.Start();

user

Author lialynn

Posted at 21:06 3. Januar 2011.

Super Post. Hat mir sehr geholfen. Danke.

user

Author MeYo

Posted at 23:44 4. Juni 2012.

Super! Hat mich weitergebracht!! 🙂
Daher ist es (zumindest für mich) „weltbewegend“ ^^

😀

user

Author Lucky95

Posted at 18:57 13. Juli 2012.

Hi,
hat mir sehr geholfen, danke! 🙂

Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

View Comments (7) ...
Navigation