目录
1.使用委托创建线程
定义委托;
通过委托函数的BeginInvoke()方法创建线程。
class Program
{
static void Main(string[] args)
{
TakesAWhileDelegate dl = TakesAWhile;
Console.WriteLine("Main Thread ID="+Thread.CurrentThread.ManagedThreadId.ToString());
IAsyncResult ar= dl.BeginInvoke(1, 3000, null, null);
//while(!ar.IsCompleted)
//{
// Console.Write(".");
// Thread.Sleep(50);
//}
while(true)
{
if(ar.AsyncWaitHandle.WaitOne(50,false))
{
Console.WriteLine("Can get result");
break;
}
}
dl.EndInvoke(ar);
Console.ReadKey();
}
static int TakesAWhile(int data, int second)
{
Console.WriteLine("TakesAWhile Started:id="+ Thread.CurrentThread.ManagedThreadId.ToString());
Thread.Sleep(second);
Console.WriteLine("TakesAWhile Ended.");
return data++;
}
public delegate int TakesAWhileDelegate(int data, int sec);
public delegate string StringDelegate(string str);
}
2.使用Thread类创建线程
///主函数部分
2.1 函数名创建
var t1 = new Thread(TakesAWhile);//函数参数需要是ThreadStart委托定义类型,void返回
t1.Start();
2.2 lambda表达式创建
var t2 = new Thread(()=> Console.WriteLine("Lambda方式创建,ID={0}",Thread.CurrentThread.ManagedThreadId));
t2.Start();
///定义部分
static void TakesAWhile()
{
Console.WriteLine("从Thread类创建,线程ID="+Thread.CurrentThread.ManagedThreadId.ToString());
}
2.3给线程传递数据
(1)方法
(2)方法
前后台线程
Thread类创建线程,可以设置IsBackground属性决定线程前后台属性
线程的优先级
Thread类创建线程,可以设置Priority属性,影响基本优先级。
线程池
当许多小任务需要完成时,事先创建许多线程。线程数在需要更多时增加,在需要释放资源时减少。
不需要自己创建列表。列表由ThreadPool类托管。池中的最大线程数可配置的。双核CPU默认设置1023个工作线程,1000个I/O线程。
线程池使用限制:
所有入池线程都是后台线程;
不能给入池线程设置优先级;
对于COM对象,入池线程都是多线程单元,许多COM对象都需要单线程单元;
入池的线程只能用于时间较短的任务。如果线程需要一直运行,例如word的拼写检查线程,就应该使用Thread类创建一个线程。