il thread con più parametri

Qualcuno sa come passare più parametri in un Thread.Routine di avvio?

Ho pensato di estendere la classe, ma il C# classe Thread è sigillato.

Qui è ciò che penso che il codice sarebbe simile a:

...
    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, io inizio a una serie di discussioni con diverse orchestrators, saldi e porte. Si prega di prendere in considerazione la sicurezza dei thread anche.

InformationsquelleAutor Lucas B | 2009-05-06

 

11 Replies
  1. 63

    Provare a utilizzare un’espressione lambda per catturare gli argomenti.

    Thread standardTCPServerThread = 
      new Thread(
        unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000)
      );
    • Quanto è sicuro è che per l’esecuzione l’espressione di un thread separato?
    • Questo è sicuro – con avvertenze. Si può avere un po ‘ strani effetti collaterali, però, se si modificano le variabili immediatamente dopo la chiamata a questo, dal momento che si sta effettivamente passando le variabili per riferimento.
    • tutte le idee su come rendere thread-safe?
    • e per .NET 2 utenti?
    • Grazie, appena risolto il mio problema 🙂
    • A causa di ciò che @Reed Copsey, ha spiegato di non farlo :for(int i = 0; i < howMany; i++) { Thread t = new Thread(unused => startSocketServerAsThread( x, y, i) ); t.Start(); }. Utilizzare un ‘proxy’ come int toPass = i;

  2. 12

    Qui è un po ‘ di codice che utilizza la matrice di oggetti approccio qui menzionato un paio di volte.

        ...
        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);
          ...
        }>
    • Penso che l’espressione lambda, JaredPar soluzione, è più facile da mantenere, (leggere, comprendere e aggiornamento)
  3. 11

    È necessario inserirli in un unico oggetto.

    Fare una classe personalizzata per passare i parametri è un’opzione. È inoltre possibile utilizzare un array o una lista di oggetti, e impostare tutti i parametri che.

  4. 7

    Utilizzare il ‘Compito’ di modello:

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

    .NET 2 conversione di JaredPar risposta

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

    Non si può. Creare un oggetto che contengono parametri di cui avete bisogno, e il passaggio è. Nel thread In funzione il cast dell’oggetto al suo tipo.

  7. 3
    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.
    }
  8. 2

    Ho letto il vostro forum per scoprire come farlo e l’ho fatto in quel modo, potrebbe essere utile per qualcuno. Io di passare gli argomenti in un costruttore che crea per me il filo di lavoro in cui verrà eseguito il mio metodo – execute() metodo.

     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();
    
        }
    }
    }
  9. 1

    Si può prendere la matrice di Oggetti e passare il filo. Passare

    System.Threading.ParameterizedThreadStart(yourFunctionAddressWhichContailMultipleParameters) 

    In filo costruttore.

    yourFunctionAddressWhichContailMultipleParameters(object[])

    È già impostato tutto il valore in objArray.

    è necessario abcThread.Start(objectArray)

  10. 0

    Si potrebbe curry “lavoro” in funzione con un’espressione lambda:

    public void StartThread()
    {
        //...
        Thread standardTCPServerThread = new Thread(
            () => standardServerThread.Start(/* whatever arguments */));
    
        standardTCPServerThread.Start();
    }
    • mmmm curry di agnello.
  11. 0

    È necessario passare un singolo oggetto, ma se è troppo fastidio per definire il proprio oggetto per un uso singolo, è possibile utilizzare un Tupla.

    • mcmillab esempio funzionante?

Lascia un commento