C#多线程及同步异步简介

详细介绍推荐该博客:https://www.cnblogs.com/wwj1992/p/5976096.html

1、多线程分为主线程、前台线程和后台线程。

①主线程:CLR(公共语言执行库)为进程自动创建。

②前台线程:自行创建线程时默认都为前台线程,前台线程全都运行完毕应用程序才可以退出。(进程的亲儿子)

③后台线程:通过Thread.IsBackground = true设置,关闭程序时所有后台线程自动结束。(进程的干儿子)


2、线程属性:

①CurrentThread:当前正在运行的线程;

②IsAlive:当前线程执行状态;

③Name:获取或设置线程名称;

④Priority:线程优先级,默认Normal,从低到高Lowest

⑤ThreadState:线程状态。


3、主要线程方法:

①Abort:通过引发异常来终止线程,可配合try;

②ResetAbort:取消终止线程的操作,可配合catch;

③Sleep:使线程进入休眠状态;

④Join:当前线程阻塞其它线程,直到该线程执行完毕或者设定时间结束;

⑤Start:不用解释了。


4、线程同步

当多线程访问同一对象时,为保证对象数据唯一,需要通过设定“锁”来保证数据的正确。常用的两种方式:

(1)lock:

①锁实例对象:先Program p = new Program(); 再 lock(this){}即可保证块内的线程同步;

②锁静态对象(常用):private static object obj = new object();通过锁全局的静态私有变量obj可保证外部无法对其进行修改。

(2)Monitor:

Monitor.Enter(obj)......代码.........Monitor.Exit(obj)等同于lock(obj)。通常配合try...catch。

常用方法:

①Pulse:通知等待队列线程对象状态已状态;

②PulseAll:通知等待队列所有线程对象状态已更改;

③Wait:释放对象的锁并使其进入等待队列;上述三方法必须用在enter和exit之间。

即通过wait和pulse,多线程可实现对同一对象的有序使用。

(3)使用回调函数跨线程访问:

回调函数建立在委托的基础上,依旧是定义、声明、实例化,通过之后触发目标操作对象的动作执行回调函数。如控件的Invoke方法,将委托和所需参数传过去即可完成操作。

5、同异步调用及回调

①同步调用:先声明委托,建立委托对象,之后myDelegate.Invoke(param1,param2)就可以了。

②异步调用:同样先委托,之后需要BeginInvoke再EndInvoke,异步调用可以选择在BeginInvoke使用回调函数,在调用结束时自动调用回调函数。BeginInvoke的参数分别为委托的参数、回调函数、回调函数参数result的附加值。回调函数的参数为IAsyncResult类型,该参数同时为BeginInvoke的返回值,用来确认异步是否完成。

关于BeginInvoke和EndInvoke详见https://www.cnblogs.com/wolf-sun/p/5675791.html


你可能感兴趣的:(C#)