Autor Beitrag
D.Follmann
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Di 06.11.07 12:36 
Hallo, ich habe mal eine grundsätzliche Frage: Ist es möglich eine Methode in einem Thread zu starten und ihr mehrere Parameter zu übergeben?
Mit ParameterizedThreadStart geht es ja nur mit einem einzigen Objekt:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
public bool Methode1()
{
  String s = new String("myString");
  Thread myThread=new Thread(new ParameterizedThreadStart(methode2));
  myThread.Start(s);
  return true;
}

private void methode2(object o)
{
 //hier soll beispielsweise irgendwas mit dem String gemacht werden
}

So kann ich ja immerhin ein Objekt übergeben, aber was ist, wenn ich z.B. 2 Strings an die Methode bergeben möchte?!? Geht das übehaupt? Wenn nicht, was für ein Objekt ist am sinnvollsten um die Parameter zusammenzufassen ? ArrayList, Collection oder was auch immer?
Danke!
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Di 06.11.07 13:42 
Hallo!

Am kompaktesten zu schreiben dürfte wohl ein Array sein, welches Du als Objekt übergibst.

Wenn Du es typensicher haben willst, gibt es in der Hilfe zum ParameterizedThreadStart unten einen Link namens "Creating Threads and Passing Data at Start Time", dort findest Du mehr Informaitonen dazu.

Grüße
Christian

//edit: Strings müssen übrigens nicht mit "new" erzeugt werden.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 06.11.07 14:11 
Anonyme Methoden wären auch noch eine Möglichkeit: An Kürze nicht zu schlagen und die Methodensignatur muss nicht geändert werden.
ausblenden C#-Quelltext
1:
new Thread(() => Methode2("Hello""World")).Start();					

Mit C# 2.0 sieht es natürlich ein wenig hässlicher aus, ist aber imo immer noch die schönste Lösung.
ausblenden C#-Quelltext
1:
2:
3:
    new Thread(delegate {
        Methode2("Hello""World");
    }).Start();


[add] Zur Vollständigkeit noch das Ganze mit Asynchronous Delegates:
ausblenden C#-Quelltext
1:
2:
3:
Action<stringstring> action = Methode2;
action.BeginInvoke("Hello""World",
  asyncResult => action.EndInvoke(asyncResult), null);

Meiner Meinung nach ist die Thread-Klasse allerdings in so gut wie allen Fällen BeginInvoke vorzuziehen, dieser Fall stellt wohl keine Ausnahme dar ;) .
[/add]
D.Follmann Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 31



BeitragVerfasst: Mi 07.11.07 08:26 
ok, danke für die hilfe!
mache das jetzt über eine Generische LIST, die ich der Thread-Methode übergebe.