views:

4926

answers:

9

Does anyone know how to pass multiple parameters into a Thread.Start routine?

I thought of extending the class, but the C# Thread class is sealed.

Here is what I think the code would look like:

...
    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, I start a number of threads with different orchestrators, balances and ports. Please consider thread safety also.

+6  A: 

You need to wrap them into a single object.

Making a custom class to pass in your parameters is one option. You can also use an array or list of objects, and set all of your parameters in that.

Reed Copsey
+2  A: 

You can't. Create an object that contain params you need, and pass is it. In the thread function cast the object back to its type.

Kamarey
+1  A: 

you can take Object array and pass it in the thread.

pass System.Threading.ParameterizedThreadStart(yourFunctionAddressWhichContailMultipleParameters) into thread constructor.

yourFunctionAddressWhichContailMultipleParameters(object[])

you already set all the value in objArray.

you need to abcThread.Start(objectArray)

Syed Tayyab Ali
A: 

I know in Java you can implement a runnable interface. I am not sure if C# has an equivalent.

uriDium
+8  A: 

Try using a lambda expression to capture the arguments.

Thread standardTCPServerThread = 
  new Thread(
    unused => startSocketServerAsThread(initializeMemberBalance, arg, 60000)
  );
JaredPar
How safe is that to execute the expression on a seperate thread?
Joshua Belden
This is safe - with caveats. It can have some strange side-effects, though, if you tweak your variables immediately after calling this, since you're effectively passing the variables in by reference.
Reed Copsey
any ideas on how to make it thread safe?
Lucas B
and for .NET 2 users?
serhio
A: 

You could curry the "work" function with a lambda expression:

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

    standardTCPServerThread.Start();
}
mquander
+3  A: 

Use the 'Task' pattern:

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 
   }
}
Frederik Gheysels
A: 

Here is a bit of code that uses the object array approach mentioned here a couple times.

...
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);
  ...
}
Opus
@Opus I think the lambda expression, JaredPar's solution, is easier to maintain (read, understand, and update)
Lucas B
A: 

no one give currect answer ......... plz give ur answer after execute

jonh
@jonh I'm not sure what you mean. This works for me.
Lucas B