fil avec plusieurs paramètres

Est-ce que quelqu'un sait comment passer plusieurs paramètres dans un Thread.Commencer la routine?

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

Voici à quoi je pense que le code ressemblerait:

...
    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 commence un certain nombre de threads avec différents orchestrateurs, balances et ports. Veuillez également tenir compte de la sécurité du filetage.

33
demandé sur John Saunders 2009-05-06 22:29:07

11 réponses

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

Thread standardTCPServerThread = 
  new Thread(
    unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000)
  );
58
répondu JaredPar 2010-05-14 11:30:34

Vous devez les envelopper dans un seul objet.

Créer une classe personnalisée pour transmettre vos paramètres est une option. Vous pouvez également utiliser un tableau ou une liste d'objets et définir tous vos paramètres.

11
répondu Reed Copsey 2009-05-06 18:31:35

Voici un peu de code qui utilise l'approche de tableau d'objets mentionnée ici quelques fois.

    ...
    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);
      ...
    }>
11
répondu Opus 2012-06-02 13:43:25

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 
   }
}
7
répondu Frederik Gheysels 2009-05-06 18:35:42

. Net 2 conversion de la réponse JaredPar

Thread standardTCPServerThread = new Thread(delegate (object unused) {
        startSocketServerAsThread(initializeMemberBalance, arg, 60000);
    });
5
répondu Aaron P. Olds 2010-11-18 15:55:19

Vous ne pouvez pas. créez un objet qui contient les paramètres dont vous avez besoin, et passez-le. Dans la fonction thread, renvoyez l'objet à son type.

3
répondu Kamarey 2009-05-06 18:31:48

J'ai lu le vôtre forum pour trouver comment le faire et je l'ai fait de cette façon - peut être utile pour quelqu'un. Je passe des arguments dans le constructeur qui crée pour moi un thread de travail dans lequel sera exécuté ma méthode- execute () Méthode.

 using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace Haart_Trainer_App

{
    class ProcessRunner
    {
        private string process = "";
        private string args = "";
        private ListBox output = null;
        private Thread t = null;

    public ProcessRunner(string process, string args, ref ListBox output)
    {
        this.process = process;
        this.args = args;
        this.output = output;
        t = new Thread(new ThreadStart(this.execute));
        t.Start();

    }
    private void execute()
    {
        Process proc = new Process();
        proc.StartInfo.FileName = process;
        proc.StartInfo.Arguments = args;
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.Start();
        string outmsg;
        try
        {
            StreamReader read = proc.StandardOutput;

        while ((outmsg = read.ReadLine()) != null)
        {

                lock (output)
                {
                    output.Items.Add(outmsg);
                }

        }
        }
        catch (Exception e) 
        {
            lock (output)
            {
                output.Items.Add(e.Message);
            }
        }
        proc.WaitForExit();
        var exitCode = proc.ExitCode;
        proc.Close();

    }
}
}
2
répondu Marek Bar 2012-11-15 07:00:43
void RunFromHere()
{
    string param1 = "hello";
    int param2 = 42;

    Thread thread = new Thread(delegate()
    {
        MyParametrizedMethod(param1,param2);
    });
    thread.Start();
}

void MyParametrizedMethod(string p,int i)
{
// some code.
}
2
répondu Muhammad Mubashir 2012-12-24 11:57:08

Vous pouvez prendre un tableau D'objets et le passer dans le thread. Passer

System.Threading.ParameterizedThreadStart(yourFunctionAddressWhichContailMultipleParameters) 

Dans le constructeur de thread.

yourFunctionAddressWhichContailMultipleParameters(object[])

Vous avez déjà défini toutes les valeurs dans objArray.

Vous devez abcThread.Start(objectArray)

1
répondu Syed Tayyab Ali 2017-07-28 13:31:02

Vous pouvez curry la fonction "work" avec une expression lambda:

public void StartThread()
{
    // ...
    Thread standardTCPServerThread = new Thread(
        () => standardServerThread.Start(/* whatever arguments */));

    standardTCPServerThread.Start();
}
0
répondu mquander 2009-05-06 18:33:37

Vous devez passer un seul objet, mais s'il est trop compliqué de définir votre propre objet pour un usage unique, vous pouvez utiliser un Tuple .

0
répondu mcmillab 2014-10-23 23:44:17