后台线程

    后台线程或二级线程可以用于执行长时间运行的任务,不阻碍主UI任务。所需的类位于mscorlib.dll程序集的System.Threading名称空间下。注意创建的Thread对象的Priority属性(优先权)。通常情况下该属性设置为BelowNormal,使后台线程不会在任何程度上影响到主线程的速度。

image

我们希望能指定i的起始值,但是线程委托ts传递的方法Method1只能是无参数无返回类型的方法。image

如何解决呢?我们可以创建一个带有多个属性的类,主线程创建该类的一个实例。

image

再来看看主线程如何调用的?(实例化对象通过构造方法传参)

image

虽然解决了问题,但是使用起来麻烦,因为需要自己定义一个类,以及该类的属性。

framework2.0的版本提供了更简单的方式。ParameterizedThreadStart委托,它指向一个以对象为参数的方法。看代码:

image

 

 

 

 

这种方式最为简单。

    多线程编程最需要慎重对待的一个问题是对共享资源进行同步访问。如果有多个线程同时读写同一个变量而没有锁定或同步这些操作,可能产生一些不可预知的结果和奇怪的行为。

image 

此时,只有一个启动主线程。我们来增加10个线程,同样的读写shareCount共享资源。

image

运行结果:

image

看起来,虽然线程的执行顺序我们无法干预,(比如线程2在线程1的前面),看结果还是没有问题的。我们再改动一下,每个线程(11个)执行的时候阻塞10毫秒。image ,我们来看两次的运行结果:

image

虽然最终结果正确,但是每个线程显示的结果已经不确定,而且每个线程显示的应该是10的倍数。这里已经完全不能保证了。

如何解决呢?在C#中要异步访问这些资源,最简单的方法是通过lock语句。程序一旦进入一个锁定阻塞,就必须在另一个线程进入锁定对同一变量进行操作之前退出。看示例:(为了直观,去掉主线程的显示)

image

image

    但是注意一点,这种方式,即使有另外的线程需要读取shareCount,也会可能被别的线程锁定而阻塞。然而通常情况下应该允许多个线程在同一时间读取同一资源,只有在写操作的时候需要锁定同步。(可以有多个读取操作,但只有唯一的写操作)。可以使用ReaderWriterLock对象来实现这种类型的锁。

 

 

 

 

 

 

 

image

可以看到,写线程锁定就必须释放后才会有下个写线程的锁定。而读线程1_1锁定,读线程2_1仍然可以访问。

image 这次的运行结果:我们发现<读线程1>_1锁定并不影响写线程_1的锁定。同样[写线程]_4锁定时不影响<读线程1>_4锁定。

综合起来:就是读写线程互不影响锁定。读线程之间互不影响。(单独的读线程访问时不受任何其他线程影响,自己是自由的。)

写线程访问时必须确保其他的写线程释放资源后才能锁定资源。

转载于:https://www.cnblogs.com/netxiaochong/archive/2012/01/29/2331001.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值