Starting Threads with Parameters in C# Using ParameterizedThreadStart Delegate

Nov 19, 2025 · Programming · 12 views · 7.8

Keywords: C# | Multithreading | ParameterizedThreadStart

Abstract: This article provides a comprehensive exploration of parameter passing mechanisms in C# multithreading. It focuses on the ParameterizedThreadStart delegate usage, detailing how to utilize specific Thread constructor overloads and Start method parameter passing to provide data input during thread initialization. The analysis covers advantages and limitations of this approach, compares it with alternatives like lambda expressions, and includes complete code examples with type safety considerations.

Basic Usage of ParameterizedThreadStart Delegate

In C# multithreading programming, the Thread class provides an overloaded constructor that accepts a ParameterizedThreadStart delegate, enabling parameter passing when starting threads. This mechanism allows input data to be provided to thread execution methods by passing parameters as object types.

Core Implementation Code

The usage of ParameterizedThreadStart delegate involves two key steps: first creating a delegate instance pointing to the target method, then passing the parameter object through the Thread.Start method.

Thread t = new Thread(new ParameterizedThreadStart(myMethod));
t.Start(myParameterObject);

The myMethod must conform to the ParameterizedThreadStart delegate signature requirements: accepting a single object type parameter and returning no value.

Delegate Signature and Method Matching

The ParameterizedThreadStart delegate is defined as a void method accepting a single object type parameter. The compiler can automatically infer the delegate type, allowing omission of explicit delegate constructor calls in most scenarios.

// Compiler automatically infers ParameterizedThreadStart delegate
Thread newThread = new Thread(DoWork);
newThread.Start(42);

// Corresponding execution method
public static void DoWork(object data)
{
    Console.WriteLine("Static thread procedure. Data='{0}'", data);
}

Type Safety Limitations

While ParameterizedThreadStart delegate provides convenience for parameter passing, its object type parameter introduces type safety concerns. Any object can be passed to the Thread.Start method, potentially causing runtime type conversion exceptions.

To enhance type safety, consider using lambda expressions for parameter capturing:

private void MyMethod(string param1, int param2)
{
    // Perform specific operations
}

Thread myNewThread = new Thread(() => MyMethod("param1", 5));
myNewThread.Start();

Multiple Parameter Passing Strategies

Since ParameterizedThreadStart delegate supports only a single parameter, the following strategies can be employed when multiple data items need to be passed:

Instance and Static Method Support

ParameterizedThreadStart delegate supports both instance methods and static methods. For instance methods, the delegate automatically binds to specific object instances.

// Usage of instance method
Work w = new Work();
newThread = new Thread(w.DoMoreWork);
newThread.Start("The answer.");

public void DoMoreWork(object data)
{
    Console.WriteLine("Instance thread procedure. Data='{0}'", data);
}

Execution Timing and Thread Lifecycle

Threads do not begin execution until the Thread.Start method is called. Once Start is invoked, the ParameterizedThreadStart delegate is called, with execution starting from the first line of the delegate-pointed method. The object parameter passed to the Start method is automatically passed to the delegate method.

Alternative Approach Comparison

Beyond ParameterizedThreadStart delegate, lambda expressions provide another parameter passing approach with better type safety and flexibility:

public Thread StartTheThread(SomeType param1, SomeOtherType param2)
{
    var t = new Thread(() => RealStart(param1, param2));
    t.Start();
    return t;
}

private static void RealStart(SomeType param1, SomeOtherType param2)
{
    // Thread execution logic
}

This approach captures parameters through closure mechanisms, avoiding type conversion risks while supporting multiple strongly-typed parameters.

Best Practice Recommendations

When selecting parameter passing approaches, consider the following factors:

By appropriately selecting parameter passing strategies, developers can build both efficient and reliable multithreaded applications.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.