Frage

Wer weiß, wie mehrere Parameter in eine Thread.Start Routine zu übergeben?

Ich dachte, die Klasse zu erweitern, aber die C # Thread-Klasse ist versiegelt.

Hier ist das, was ich denke, der Code aussehen würde:

...
    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, beginne ich eine Reihe von Fäden mit unterschiedlichen orchestrators, Salden und Häfen. Bitte beachten Sie die Thread-Sicherheit auch.

War es hilfreich?

Lösung

Versuchen Sie, einen Lambda-Ausdruck mit den Argumenten zu erfassen.

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

Andere Tipps

Hier ist ein Stück Code, der das Objekt Array Ansatz hier ein paar Mal erwähnt 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 wickeln.

eine benutzerdefinierte Klasse zu machen in Ihren Parametern zu übergeben ist eine Option. Sie können auch ein Array oder eine Liste von Objekten verwendet werden, und dass alle Ihre Parameter einstellen.

Mit den 'Aufgabe' 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 Umwandlung von JaredPar Antwort

Thread standardTCPServerThread = new Thread(delegate (object unused) {
        startSocketServerAsThread(initializeMemberBalance, arg, 60000);
    });

Sie können nicht. Erstellen Sie ein Objekt, das params Sie enthalten müssen, und Pass ist es. In der Thread-Funktion wirft das Objekt wieder in seine Art.

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

Ich habe Forum lesen Sie, um herauszufinden, wie es zu tun, und ich habe es auf diese Weise - vielleicht für jemanden nützlich sein. Ich gebe Argumente in Konstruktor, der für mich schafft Thread arbeitet, in dem mein Verfahren ausgeführt wird -. execute () Methode

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

    }
}
}

Sie können Object-Array nehmen und es in dem Thread passieren. Pass

System.Threading.ParameterizedThreadStart(yourFunctionAddressWhichContailMultipleParameters) 

In Thread-Konstruktor.

yourFunctionAddressWhichContailMultipleParameters(object[])

Sie haben bereits alle den Wert in objArray gesetzt.

Sie müssen abcThread.Start(objectArray)

Sie könnten die "Arbeit" Funktion mit einem Lambda-Ausdruck Curry:

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

    standardTCPServerThread.Start();
}

Sie müssen ein einzelnes Objekt passieren, aber wenn es zu viel Aufwand ist Ihr eigenes Objekt für eine einzelne Anwendung zu definieren, können Sie eine Tuple .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top