后台线程
后台线程或二级线程可以用于执行长时间运行的任务,不阻碍主UI任务。所需的类位于mscorlib.dll程序集的System.Threading名称空间下。注意创建的Thread对象的Priority属性(优先权)。通常情况下该属性设置为BelowNormal,使后台线程不会在任何程度上影响到主线程的速度。
我们希望能指定i的起始值,但是线程委托ts传递的方法Method1只能是无参数无返回类型的方法。
如何解决呢?我们可以创建一个带有多个属性的类,主线程创建该类的一个实例。
再来看看主线程如何调用的?(实例化对象通过构造方法传参)
虽然解决了问题,但是使用起来麻烦,因为需要自己定义一个类,以及该类的属性。
framework2.0的版本提供了更简单的方式。ParameterizedThreadStart委托,它指向一个以对象为参数的方法。看代码:
这种方式最为简单。
多线程编程最需要慎重对待的一个问题是对共享资源进行同步访问。如果有多个线程同时读写同一个变量而没有锁定或同步这些操作,可能产生一些不可预知的结果和奇怪的行为。
此时,只有一个启动主线程。我们来增加10个线程,同样的读写shareCount共享资源。
运行结果:
看起来,虽然线程的执行顺序我们无法干预,(比如线程2在线程1的前面),看结果还是没有问题的。我们再改动一下,每个线程(11个)执行的时候阻塞10毫秒。 ,我们来看两次的运行结果:
虽然最终结果正确,但是每个线程显示的结果已经不确定,而且每个线程显示的应该是10的倍数。这里已经完全不能保证了。
如何解决呢?在C#中要异步访问这些资源,最简单的方法是通过lock语句。程序一旦进入一个锁定阻塞,就必须在另一个线程进入锁定对同一变量进行操作之前退出。看示例:(为了直观,去掉主线程的显示)
但是注意一点,这种方式,即使有另外的线程需要读取shareCount,也会可能被别的线程锁定而阻塞。然而通常情况下应该允许多个线程在同一时间读取同一资源,只有在写操作的时候需要锁定同步。(可以有多个读取操作,但只有唯一的写操作)。可以使用ReaderWriterLock对象来实现这种类型的锁。
可以看到,写线程锁定就必须释放后才会有下个写线程的锁定。而读线程1_1锁定,读线程2_1仍然可以访问。
这次的运行结果:我们发现<读线程1>_1锁定并不影响写线程_1的锁定。同样[写线程]_4锁定时不影响<读线程1>_4锁定。
综合起来:就是读写线程互不影响锁定。读线程之间互不影响。(单独的读线程访问时不受任何其他线程影响,自己是自由的。)
写线程访问时必须确保其他的写线程释放资源后才能锁定资源。
当来之世,经道灭尽,我以慈悲哀愍,特留此经止住百岁。其有众生,值斯经者,随意所愿,皆可得度。(南无阿弥陀佛)
道可道,非常道;名可名,非常名。
我常说,一个国家,一个民族,亡国都不怕,最可怕的是一个国 家和民族自己的根本文化亡掉了,这就会沦为万劫不复,永远不会翻身。---南怀瑾<国学大师>