Thread构造函数

本文详细解析了C#中Thread类的四种构造函数,并通过MSIL反汇编揭示了如何将方法关联到ThreadStart或ParameterizedThreadStart委托。这对于理解线程创建及启动过程非常有帮助。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前在使用Thread类创建新线程的时候,都是按照如下方法创建的:

Thread myThread = new Thread(StartMethord)  //StartMethord为线程启动时要执行的方法

myThread .Start();// 或者是myThread .Start(“参数”);

 

==============

private void StartMethord()

{

      //XXX

}  或者

 

private void StartMethord(object obj)

{

      //XXX

}  

后来才知道Thread的构造函数又4种:

1,public Thread(
    ParameterizedThreadStart start //ParameterizedThreadStart 表示线程启动时,要调用的方法,带一个Object参数
)

2,public Thread(
    ParameterizedThreadStart start,int maxStackSize

      //ParameterizedThreadStart 表示线程启动时,要调用的方法

      //maxStackSize 线程使用的最大堆栈值
)

3,

public Thread(
    ThreadStart start //表示线程启动时,要调用的方法 没有参数的
)

4

 

public Thread(
    ThreadStart start, int maxStackSize

//表示线程启动时,要调用的方法 没有参数的

//maxStackSize 线程使用的最大堆栈值


)

 

显然这4种构造函数没有一个符合我以前创建线程的方式。

我猜测应该是.Net自动的将StartMethord关联到相应的委托去了。

通过MSIL反汇编证明了确实如此,下面是反编译后的代码

 

有参数的:
.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       38 (0x26)
  .maxstack  3
  .locals init ([0] class [mscorlib]System.Threading.Thread myThr)
  IL_0000:  nop
  IL_0001:  ldnull
  IL_0002:  ldftn      void '异步委托'.Program::StartMethord(object)
  IL_0008:  newobj     instance void [mscorlib]System.Threading.ParameterizedThreadStart::.ctor(object,
                                                                                                native int)
  IL_000d:  newobj     instance void [mscorlib]System.Threading.Thread::.ctor(class [mscorlib]System.Threading.ParameterizedThreadStart)
  IL_0012:  stloc.0
  IL_0013:  ldloc.0
  IL_0014:  ldstr      bytearray (50 5B BF 7E 0B 7A C2 53 70 65 )                   // P[.~.z.Spe
  IL_0019:  callvirt   instance void [mscorlib]System.Threading.Thread::Start(object)
  IL_001e:  nop
  IL_001f:  call       int32 [mscorlib]System.Console::Read()
  IL_0024:  pop
  IL_0025:  ret
} // end of method Program::Main

 

//无参数的

.method private hidebysig static void  Main(string[] args) cil managed
{
  .entrypoint
  // 代码大小       33 (0x21)
  .maxstack  3
  .locals init ([0] class [mscorlib]System.Threading.Thread myThr)
  IL_0000:  nop
  IL_0001:  ldnull
  IL_0002:  ldftn      void '异步委托'.Program::StartMethord()
  IL_0008:  newobj     instance void [mscorlib]System.Threading.ThreadStart::.ctor(object,
                                                                                   native int)
  IL_000d:  newobj     instance void [mscorlib]System.Threading.Thread::.ctor(class [mscorlib]System.Threading.ThreadStart)
  IL_0012:  stloc.0
  IL_0013:  ldloc.0
  IL_0014:  callvirt   instance void [mscorlib]System.Threading.Thread::Start()
  IL_0019:  nop
  IL_001a:  call       int32 [mscorlib]System.Console::Read()
  IL_001f:  pop
  IL_0020:  ret
} // end of method Program::Main

 

大家注意红色的地方,自动关联上去了。

 

第一次写东西, 主要的目的是要自己记住会的,同时能学习自己不会的。

写得不好,希望大家不要骂,谢谢!

转载于:https://www.cnblogs.com/aierduo/archive/2009/05/08/yumena.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值