为什么 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.
我有一个启动线程的简单程序。 作为线程的参数,我传递了一个 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.