it-swarm.com.de

Übergeben Sie Parameter durch ParameterizedThreadStart

Ich versuche, die folgenden Parameter zu übergeben:

Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));

Irgendeine Idee, wie das geht? Ich würde mich über etwas Hilfe freuen

42
liamp47

lazyberezovsky hat die richtige Antwort. Ich möchte anmerken, dass Sie aufgrund der Variablenerfassung technisch eine beliebige Anzahl von Argumenten mit einem Lambda-Ausdruck übergeben können:

var thread = new Thread(
       () => DoMethod(a, b, c));
thread.Start();

Dies ist eine praktische Methode zum Aufrufen von Methoden, die nicht zum Delegat ThreadStart oder ParameterizedThreadStart passen. Sie sollten jedoch leicht ein Datenrennen verursachen, wenn Sie die Argumente im übergeordneten Thread ändern, nachdem Sie sie an den Code des untergeordneten Threads übergeben haben.

86
Tudor

Verwenden Sie die überladene Thread.Start -Methode, die ein Objekt akzeptiert (Sie können Ihren benutzerdefinierten Typ oder Ihr benutzerdefiniertes Array übergeben, wenn Sie mehrere Parameter benötigen):

Foo parameter = // get parameter value
Thread thread = new Thread(new ParameterizedThreadStart(DoMethod));
thread.Start(parameter);

In DoMethod können Sie einfach ein Argument in Ihren Parametertyp umwandeln:

private void DoMethod(object obj)
{
    Foo parameter = (Foo)obj;
    // ...    
}

BTW in .NET 4.0 und höher können Sie Aufgaben verwenden (achten Sie auch auf die Race-Bedingungen):

Task.Factory.StartNew(() => DoMethod(a, b, c));
32

Eine andere Möglichkeit, das zu archivieren, was Sie möchten, besteht darin, einen Delegierten innerhalb Ihrer Funktion/Methode zurückzugeben. Nehmen Sie das folgende Beispiel:

class App
{
  public static void Main()
  {
     Thread t = new Thread(DoWork(a, b));
     t.Start();
     if (t.IsAlive)
     {
         t.IsBackground = true;
     }
  }

  private static ThreadStart DoWork(int a, int b)
  {
      return () => { /*DoWork*/ var c = a + b; };
  }

}
1
Lorenz Lo Sauer
new Thread(() => { DoMethod(a, b, c); }).Start();

oder

new Thread(() => DoMethod(a, b, c)).Start();
1
Fly Rose

Anstatt eine Klasse für die Übergabe mehrerer Parameter zu erstellen, wie dies bei @ user1958681 der Fall war, können Sie anonyme Typen verwenden und dann einfach die dynamische Typisierung verwenden, um Ihre Parameter zu extrahieren.

class MainClass
{
    int A = 1;
    string B = "Test";

    Thread ActionThread = new Thread(new ParameterizedThreadStart(DoWork));    
    ActionThread.Start(new { A, B});
}

Dann in DoWork

private static void DoWork(object parameters)
{
   dynamic d = parameters;

    int a = parameters.A;
    string b = parameters.B;
 }
0
Peter Henry
// Parameters to pass to ParameterizedThreadStart delegate
// - in this example, it's an Int32 and a String:
class MyParams
{
    public int A { get; set; }
    public string B { get; set; }

    // Constructor
    public MyParams(int someInt, string someString)
    {
        A = someInt;
        B = someString;
    }
}

class MainClass
{
    MyParams ap = new MyParams(10, "Hello!");
    Thread t = new Thread(new ParameterizedThreadStart(DoMethod));
    t.Start(ap); // Pass parameters when starting the thread
}
0
user1958681