28 votes

fil avec plusieurs paramètres

Quelqu'un sait-il comment passer plusieurs paramètres dans une routine Thread.Start ?

J'ai pensé à étendre la classe, mais la classe Thread de C# est scellée.

Voici ce à quoi je pense que le code devrait ressembler :

...
    Thread standardTCPServerThread = new Thread(startSocketServerAsThread);

    standardServerThread.Start( orchestrator, initializeMemberBalance, arg, 60000);
...
}

static void startSocketServerAsThread(ServiceOrchestrator orchestrator, List<int> memberBalances, string arg, int port)
{
  startSocketServer(orchestrator, memberBalances, arg, port);
}

BTW, je lance un certain nombre de fils avec différents orchestrateurs, balances et ports. Veuillez également tenir compte de la sécurité des fils.

51voto

JaredPar Points 333733

Essayez d'utiliser une expression lambda pour capturer les arguments.

Thread standardTCPServerThread = 
  new Thread(
    unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000)
  );

11voto

Reed Copsey Points 315315

Vous devez les regrouper en un seul objet.

La création d'une classe personnalisée pour passer vos paramètres est une option. Vous pouvez également utiliser un tableau ou une liste d'objets et y définir tous vos paramètres.

7voto

Frederik Gheysels Points 36354

Utilisez le modèle "Task" :

public class MyTask
{
   string _a;
   int _b;
   int _c;
   float _d;

   public event EventHandler Finished;

   public MyTask( string a, int b, int c, float d )
   {
      _a = a;
      _b = b;
      _c = c;
      _d = d;
   }

   public void DoWork()
   {
       Thread t = new Thread(new ThreadStart(DoWorkCore));
       t.Start();
   }

   private void DoWorkCore()
   {
      // do some stuff
      OnFinished();
   }

   protected virtual void OnFinished()
   {
      // raise finished in a threadsafe way 
   }
}

5voto

Opus Points 71

Voici un bout de code qui utilise l'approche des tableaux d'objets mentionnée ici à plusieurs reprises.

    ...
    string p1 = "Yada yada.";
    long p2 = 4715821396025;
    int p3 = 4096;
    object args = new object[3] { p1, p2, p3 };
    Thread b1 = new Thread(new ParameterizedThreadStart(worker));
    b1.Start(args);
    ...
    private void worker(object args)
    {
      Array argArray = new object[3];
      argArray = (Array)args;
      string p1 = (string)argArray.GetValue(0);
      long p2 = (long)argArray.GetValue(1);
      int p3 = (int)argArray.GetValue(2);
      ...
    }>

5voto

Aaron P. Olds Points 51

Conversion .NET 2 de la réponse de JaredPar

Thread standardTCPServerThread = new Thread(delegate (object unused) {
        startSocketServerAsThread(initializeMemberBalance, arg, 60000);
    });

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X