1.如果不用传递参数和返回结果,仅仅是执行代码体,则直接在新建线程的时候传递函数的名称。
Thread th = new Thread(FunctionName);
完整代码如下所示,新建子线程开始后,主线程立即返回,主线程与子线程同时运行,在屏幕上打印内容。
using System;
using System.Threading;
namespace EXE
{
class F {
public static void Count()
{
int max;
max = 10;
while( max > 0 )
{
max -- ;
Thread.Sleep(1000);
Console.WriteLine("child thread count is {0}",max);
}
}
}
class Program{
public static void Main(string[] args)
{
Console.WriteLine("this is in main thread");
Thread th = new Thread(F.Count);//在新建线程的时候传递函数名称.
//设置在新线程中要执行的函数.
th.Start();//新线程开始运行.
//主线程立即返回,往下执行.
//当然,与此同时,子线程也在运行
int max;
max = 10;
while(max >= 0)
{
Console.WriteLine("main thread count is {0}",max--);
Thread.Sleep(1000);
}
Console.WriteLine("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
我们可以看到,在屏幕上同时打印主线程和子线程的内容。为什么是在一个黑框框呢,因为只有一个进程。如果是两个进程暨两个运行程序的话,是两个黑框框的。从这一点可以看出多线程和多进程的区别。
2.如果需要传递参数或(和)返回结果,那么就使用函数代表的BeginInvoke()和EndInvoke()方法,中间需要一个IAsyncResult(非同步结果对象)作为转接的接口。
完整代码如下
using System;
using System.Threading;
namespace invoke
{
delegate int Func(int x);
class F {
public static int Inrement(int x)
{
Thread.Sleep(x*1000);//x 有多大,就停留几秒.一次停够.
Console.WriteLine("incrementing");
return x+1;//停顿若干秒后,返回x+1.
}
}
class Program {
public static void Main(string[] args)
{
Func f = new Func(F.Inrement);
int x;
x = 10;
//函数代表开始激发,即新开子线程,在其中执行函数代表的代表的函数.
//激发过程返回一个异步结果对象,里面存的有函数执行状态等
IAsyncResult result = f.BeginInvoke(x,null,null);
//函数代表激发后,主线程继续往下运行,
//目前状态,主、子线程同时运行
while(x>0)
{
Console.WriteLine("the number is {0}",x--);
Thread.Sleep(1000);//在主线程中,x有多大,就暂停多少秒.分步停.
}
int y = f.EndInvoke(result);//终止激发,异步结果对象作为参数.
//查询结果对象里的域,看能否成功结束激发
//若能,则函数的结果被返回
Console.WriteLine(y);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
从屏幕上的打印结果来看,虽然主、子线程都分别停顿十秒,但是它们的耗时并没有累加成20秒,而是主线程耗时10秒执行完毕后,子线程的结果马上出来打印了。
这就是多线程的魅力吧。