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.
11 réponses
Essayez d'utiliser une expression lambda pour capturer les arguments.
Thread standardTCPServerThread =
new Thread(
unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000)
);
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.
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);
...
}>
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
}
}
. Net 2 conversion de la réponse JaredPar
Thread standardTCPServerThread = new Thread(delegate (object unused) {
startSocketServerAsThread(initializeMemberBalance, arg, 60000);
});
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.
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();
}
}
}
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.
}
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)
Vous pouvez curry la fonction "work" avec une expression lambda:
public void StartThread()
{
// ...
Thread standardTCPServerThread = new Thread(
() => standardServerThread.Start(/* whatever arguments */));
standardTCPServerThread.Start();
}
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 .