当前位置: 首页 > 科技观察

实例讲解.NET多线程执行功能

时间:2023-03-22 11:22:18 科技观察

这里为什么会出现多线程?原因是DebugLZQ在写LINQ综合demo的时候遇到了多线程,所以停下来整理一下。园子里关于多线程的文章很多很多,关于多线程的理论性的东西我就不说了。这篇博文主要用最简单的例子来总结一下多线程调用函数的相关注意点。重点是应用程序和内存。1、多线程调用无参数函数usingSystem;使用System.Collections.Generic;使用System.Linq;使用系统文本;使用系统线程;");Threadt=newThread(newThreadStart(ShowTime));//注意ThreadStart委托的定义形式t.Start();//线程启动,控制权返回主线程Console.WriteLine("主线程继续执行");//while(t.IsAlive==true);Thread.Sleep(1000);t.Abort();t.Join();//阻塞主线程直到t终止Console.WriteLine("--------------");Console.ReadKey();}staticvoidShowTime(){while(true){Console.WriteLine(DateTime.Now.ToString());}}}}注意ThreadStart委托定义如下:可见其对传递函数的要求是:返回值void,无参数。2、多线程调用带参数的函数(两种方法)WriteLine("Mainthreadstarts");Threadt=newThread(newParameterizedThreadStart(DoSomething));//注意ParameterizedThreadStart的定义形式delegatet.Start(newstring[]{"Hello","World"});Console.WriteLine("Mainthreadcontinuestoexecute");Thread.Sleep(1000);t.Abort();t.Join();//阻塞Main线程直到t终止Console.ReadKey();}staticvoidDoSomething(objects){string[]strs=sassstring[];while(true){Console.WriteLine("{0}--{1}",strs[0],strs[1]);}}}}注意ParameterizedThreadStart委托定义如下:可见其对传入函数的要求是:返回值void,参数个数1,参数类型objectusingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;namespacemultithreading2_withparameter2{classProgram{staticvoidMain(string[]args){Guestguest=newGuest(){Name="Hello",Age=99};Threadt=newThread(newThreadStart(guest.DoSomething));//注意苏氨酸eadStartdelegate的定义形式t.Start();Thread.Sleep(1000);t.Abort();t.Join();//阻塞主线程直到t终止Console.ReadKey();}}//classGuest{publicstringName{get;set;}publicintAge{get;set;}publicvoidDoSomething(){while(true){Console.WriteLine("{0}--{1}",Name,Age);}}}}这个仍然是使用ThreadStart委托,方法封装成两个方法,可以随意选择,第一个好像更简单。3、线程同步线程同步的方法有很多volatile、Lock、InterLock、Monitor、Mutex、ReadWriteLock……这里用Lock来说明问题:同步哪里,用什么,同步谁?首先感受一下不同步会出现的问题:代码就是下面这段代码去除锁块。usingSystem;usingSystem.Collections.Generic;usingSystem.Linq;usingSystem.Text;usingSystem.Threading;命名空间多线程3_synchronization2{classProgram{staticobjectobj=newobject();//staticintbalance=500用于同步;staticvoidMain(string[]args){Threadt1=newThread(newThreadStart(Credit));t1.Start();Threadt2=newThread(newThreadStart(Debit));t2.Start();Console.ReadKey();}staticvoidCredit(){for(inti=0;i<15;i++){lock(obj){balance+=100;Console.WriteLine("Aftercrediting,balanceis{0}",balance);}}}staticvoidDebit(){for(inti=0;i<15;i++){lock(obj){balance-=100;Console.WriteLine("Afterdebiting,balanceis{0}",balance);}}}}}总结:多线程调用函数就是这样。在Winform中,控件绑定到一个特定的线程,从另一个线程更新控件不应该直接调用控件的成员,这是非常有用的。原文链接:http://www.cnblogs.com/DebugLZQ/archive/2012/11/11/2765487.html