it-swarm.com.de

thread mit mehreren Parametern

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.

34
Lucas B

Verwenden Sie einen Lambda-Ausdruck, um die Argumente zu erfassen. 

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

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);
      ...
    }>
12
Opus

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.

11
Reed Copsey

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 
   }
}
7

.NET 2-Konvertierung der JaredPar-Antwort

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

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.

3
Kamarey

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();

    }
}
}
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

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)

1
Syed Tayyab Ali

Sie können die Funktion "Arbeit" mit einem Lambda-Ausdruck erstellen:

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

    standardTCPServerThread.Start();
}
0
mquander

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.

0
mcmillab