为什么ParameterizedThreadStart可以不获取任何参数?

问题描述 投票:0回答:3

我有一个简单的程序来启动线程。作为线程的参数,我传递了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,我希望得到一个错误。

c# multithreading object asynchronous parameterized
3个回答
0
投票

这是预期的行为。 Start将使用其参数调用该方法,如果未获取任何参数,它将使用每个参数的默认值调用该方法。并且因为您没有以任何可能导致其默认值发生异常的方式使用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);
}

这将引发null引用异常,因为string的默认值为null。这是哪里:

thread.Start("Hello World");

将打印String passed has a length of: 11


0
投票

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

如果此重载与使用MSDN Thread.Start()委托,ParameterizedThreadStart传递给方法由线程执行。


0
投票

您需要调用带有参数的null重载:例如:

Thread.Start

您正在调用的thread.Start("Hello world"); 方法将导致Start传递给线程函数:

如果此重载与使用ParameterizedThreadStart委托,将null传递给方法由线程执行。

© www.soinside.com 2019 - 2024. All rights reserved.