Kann jemand mehrere Parameter in eine Thread.Start-Routine übergeben?
Ich dachte daran, die Klasse zu erweitern, aber die C # -Thread-Klasse ist versiegelt.
Ich denke, der Code würde folgendermaßen aussehen:
...
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);
}
Übrigens, ich starte eine Reihe von Threads mit verschiedenen Orchestratoren, Waagen und Ports. Bitte beachten Sie auch die Gewindesicherheit.
Verwenden Sie einen Lambda-Ausdruck, um die Argumente zu erfassen.
Thread standardTCPServerThread =
new Thread(
unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000)
);
Hier ist ein bisschen Code, der den hier erwähnten Objekt-Array-Ansatz ein paar Mal verwendet.
...
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);
...
}>
Sie müssen sie in ein einzelnes Objekt packen.
Das Erstellen einer benutzerdefinierten Klasse für die Übergabe Ihrer Parameter ist eine Option. Sie können auch ein Array oder eine Liste von Objekten verwenden und alle Ihre Parameter darin festlegen.
Verwenden Sie das 'Task'-Muster:
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-Konvertierung der JaredPar-Antwort
Thread standardTCPServerThread = new Thread(delegate (object unused) {
startSocketServerAsThread(initializeMemberBalance, arg, 60000);
});
Du kannst nicht Erstellen Sie ein Objekt, das die benötigten Parameter enthält, und übergeben Sie es. In der Thread-Funktion wird das Objekt wieder in seinen Typ umgewandelt.
Ich habe Ihr Forum gelesen, um herauszufinden, wie es geht, und ich habe es auf diese Weise getan - es könnte für jemanden nützlich sein. Ich übergebe Argumente im Konstruktor, der für mich einen Arbeitsthread erstellt, in dem meine Methode - Ausführen () Methode ausgeführt wird.
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.
}
Sie können Object Array nehmen und im Thread übergeben. Bestehen
System.Threading.ParameterizedThreadStart(yourFunctionAddressWhichContailMultipleParameters)
In den Thread-Konstruktor.
yourFunctionAddressWhichContailMultipleParameters(object[])
Sie haben bereits alle Werte in objArray festgelegt.
sie müssen abcThread.Start(objectArray)
Sie können die Funktion "Arbeit" mit einem Lambda-Ausdruck erstellen:
public void StartThread()
{
// ...
Thread standardTCPServerThread = new Thread(
() => standardServerThread.Start(/* whatever arguments */));
standardTCPServerThread.Start();
}
Sie müssen ein einzelnes Objekt übergeben. Wenn es jedoch zu mühsam ist, Ihr eigenes Objekt für eine einzelne Verwendung zu definieren, können Sie ein Tuple verwenden.