为什么 ParameterizedThreadStart 在没有获取任何参数的情况下工作?

why does ParameterizedThreadStart work without getting any parameter?

我有一个启动线程的简单程序。 作为线程的参数,我传递了一个 ParameterizedThreadStart 委托。 到这里一切都好。 现在当我启动线程时,我需要向它传递一个必需的对象,但令人惊讶的是它在不给它任何对象的情况下都运行良好!怎么会?

class Program
{
    static void Main(string[] args)
   {
        Thread thread = new Thread(new ParameterizedThreadStart(F1));
        thread.Start();  //Why does it work with out passing any argument?
        Console.ReadLine();
    }

    public static void F1(object obj)
    {
        Console.WriteLine("Hello");
    }
}

程序打印 Hello,我预计会得到一个错误。

您需要调用带参数的 Thread.Start 重载:例如:

thread.Start("Hello world");

您正在调用的Start方法将导致null被传递给线程函数:

If this overload is used with a thread created using a ParameterizedThreadStart delegate, null is passed to the method executed by the thread.

这是预期的行为。 Start 将使用它的参数调用该方法,如果它没有获得任何参数,它将以 null 作为参数 (source) 调用该方法。而且因为您没有以任何可能导致其默认异常的方式使用您的 obj,所以没有任何东西会引发异常。

在您的示例中,obj 将始终为 null,但由于您未对它执行任何操作,因此它不会引发异常。让我们试试这个:

static void Main(string[] args)
{
    Thread thread = new Thread(new ParameterizedThreadStart(F1));
    thread.Start();  // Will throw a null reference exception
    Console.ReadLine();
}

public static void F1(string obj)
{
    Console.WriteLine("String passed has a length of: " + obj.Length);
}

这会抛出一个空引用异常,因为string的默认值是null。在哪里:

thread.Start("Hello World");

将打印 String passed has a length of: 11

您的代码必须有效并将 null 值传递给方法 F1。此行为记录在 MSDN Thread.Start():

If this overload is used with a thread created using a ParameterizedThreadStart delegate, null is passed to the method executed by the thread.