一,为什么要用多线程?
一个进程至少有一个线程,使用多线程可以让一个进程同时处理多件事情。
多线程可用在以下场合:
1. 网络socket通信;
2. 执行占用大量时间的操作;
3. 用户界面响应用户操作,由后台来执行任务等。
二,无参多线程的使用
Thread thread = new Thread(new ThreadStart(SayHello));
thread.Start();
1. new一个线程时需要传委托ThreadStart,此委托无返回值无参数;
2. Start()方法是告诉操作系统此线程已准备就绪,而并非真的开始执行,具体什么时候执行是靠操作系统来分配的。
三,有参多线程的使用
Thread thread = new Thread(new ParameterizedThreadStart(SayHi));
thread.Start("Tom");
1. new一个线程时需要传委托ParameterizedThreadStart,无返回值,参数类型为object;
2. 要传递的参数用Start()方法传进去。
四,怎么样传递多个参数?
由于ParameterizedThreadStart委托传递参数类型为object,所以可以通过传递数组或泛型集合等来传递多个参数,如:
List<string>list = new List<string>();
list.Add("Tom");
list.Add("Jony");
list.Add("HanMeiMei");
Thread thread = newThread(new ParameterizedThreadStart(SayHi));
thread.Start(list);
五,线程的常用属性与方法
1. 当前线程:
Thread.CurrentThread
2. 线程ID,线程的唯一标识:
thread.ManagedThreadId
3. 线程休眠,静态方法,单位为ms
Thread.Sleep(3000);
4. 终止线程:
thread.Abort();
5. 线程优先级,值为一枚举值,此属性作用是建议操作系统设置成此优先级。
thread.Priority = ThreadPriority.Highest;
六,前台线程与后台线程
1. 设置方法:
thread.IsBackground= true;
设置为true是后台线程,为false为前台线程;
2. 前台线程与后台线程的区别:
前台线程:只有当所有的前台线程都关闭,程序才关闭。
后台线程:若所有前台线程都关闭,则后台线程也会自动关闭。
七,线程同步,解决多方法重入问题
1. 用Lock锁来实现线程同步:
Person per = new Person();
lock(per)
{
//要执行代码
foreach(String str in(List<string>)list)
{
Console.WriteLine(str+ ",how are you?");
}
Thread.Sleep(3000);
Console.WriteLine("线?程¨¬ID:êo{0}", Thread.CurrentThread.ManagedThreadId);
}
将要执行的代码锁住,则解决多方法重入时共享资源的协调的问题。
八,解决Winform中无法在一个线程中控制另一个线程创建的控件的问题
1. 关闭C#的检查功能:
Contorl.CheckForIllegalCrossThreadCalls=false;
2. 使用Invoke()方法。