gpt4 book ai didi

c# - 线程与线程启动

转载 作者:IT王子 更新时间:2023-10-29 04:42:10 26 4
gpt4 key购买 nike

在 C# 中,实际上,我没有观察到以下任何区别:

new Thread(SomeMethod).Start();

,

new Thread(new ParameterizedThreadStart(SomeMethod));

new Thread(new ThreadStart(SomeMethod));

有什么区别,如果有的话?

最佳答案

Thread(ThreadStart) 构造函数只能在 SomeMethod 方法的签名与 ThreadStart 委托(delegate)匹配时使用。相反,Thread(ParameterizedThreadStart) 需要 SomeMethod 来匹配 ParameterizedThreadStart 委托(delegate)。签名如下:

public delegate void ThreadStart()
public delegate void ParameterizedThreadStart(Object obj)

具体来说,这意味着当您的方法不接受任何参数时,您应该使用 ThreadStart,而当它接受单个 Object 时,您应该使用 ParameterizedThreadStart范围。前者创建的线程应通过调用 Start() 启动,而后者创建的线程应通过 Start(Object) 指定参数。

public static void Main(string[] args)
{
var threadA = new Thread(new ThreadStart(ExecuteA));
threadA.Start();

var threadB = new Thread(new ParameterizedThreadStart(ExecuteB));
threadB.Start("abc");

threadA.Join();
threadB.Join();
}

private static void ExecuteA()
{
Console.WriteLine("Executing parameterless thread!");
}

private static void ExecuteB(Object obj)
{
Console.WriteLine($"Executing thread with parameter \"{obj}\"!");
}

最后,您可以在不指定ThreadStartParameterizedThreadStart 委托(delegate)的情况下调用Thread 构造函数。在这种情况下,编译器将根据其签名将您的方法与构造函数重载相匹配,隐式执行转换。

var threadA = new Thread(ExecuteA);   // implicit cast to ThreadStart
threadA.Start();

var threadB = new Thread(ExecuteB); // implicit cast to ParameterizedThreadStart
threadB.Start("abc");

关于c# - 线程与线程启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29862234/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com