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

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

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

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

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

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


2、线程属性:

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

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

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

④Priority:线程优先级,默认Normal,从低到高Lowest<BelowNormal<Normal<AboveNormal<Highest,优先级高只意味着得到的运行几率高一些,并不是优先级低的无法执行,优先级高的执行几十次总有一次会让优先级低的执行;

⑤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,多线程可实现对同一对象的有序使用。


5、同异步调用及回调

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

②异步调用:同样先委托,之后需要BeginInvoke再EndInvoke,异步调用需要在BeginInvoke使用回调函数,在调用结束时自动回调。AsyncCallback callback = 要执行的函数,IAsyncResult = BeginInvoke,该返回值也是EndInvoke和AsyncCallback的参数。

持续修改中。。。

猜你喜欢

转载自blog.csdn.net/RunaHazuki/article/details/80942607