Thread构造函数
以前在使用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
大家注意红色的地方,自动关联上去了。
第一次写东西, 主要的目的是要自己记住会的,同时能学习自己不会的。
写得不好,希望大家不要骂,谢谢!