web-dev-qa-db-fra.com

fil avec plusieurs paramètres

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

J'ai pensé à étendre la classe, mais la classe C # Thread 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);
}

En passant, je démarre un certain nombre de threads avec différents orchestrateurs, balances et ports. S'il vous plaît envisager la sécurité du fil aussi.

34
Lucas B

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

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

Voici un peu de code qui utilise l'approche du tableau d'objets mentionnée ici plusieurs 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);
      ...
    }>
12
Opus

Vous devez les envelopper dans un seul objet.

Faire une classe personnalisée pour passer vos paramètres est une option. Vous pouvez également utiliser un tableau ou une liste d'objets et définir tous vos paramètres dans cette configuration.

11
Reed Copsey

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

Conversion .NET 2 de JaredPar answer

Thread standardTCPServerThread = new Thread(delegate (object unused) {
        startSocketServerAsThread(initializeMemberBalance, arg, 60000);
    });
5
Aaron P. Olds

Tu ne peux pas. Créez un objet qui contient les paramètres dont vous avez besoin, et passez-le. Dans la fonction thread, convertissez l'objet en son type.

3
Kamarey

J'ai lu votre forum pour savoir comment le faire et je l'ai fait de cette façon - cela pourrait être utile pour quelqu'un. Je passe des arguments dans le constructeur qui crée pour moi un fil de travail dans lequel sera exécutée ma méthode - execute () method.

 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
Marek Bar
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
Muhammad Mubashir

Vous pouvez prendre Object array et le transmettre au fil. 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
Syed Tayyab Ali

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

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

    standardTCPServerThread.Start();
}
0
mquander

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

0
mcmillab