C#知识
ReaderWriterLock 用于同步对资源的访问。在任一特定时刻,它允许多个线程同时进行读访问,或者允许单个线程进行写访问。在资源不经常发生更改的情况下,ReaderWriterLock 所提供的吞吐量比简单的一次只允许一个线程的锁(如 Monitor)更高。
在多数访问为读访问,而写访问频率较低、持续时间也比较短的情况下,ReaderWriterLock 的性能最好。多个读线程与单个写线程交替进行操作,所以读线程和写线程都不会长时间阻止。
读线程和写线程将分别排入各自的队列。当线程释放写线程锁时,此刻读线程队列中的所有等待线程都将被授予读线程锁;当已释放所有读线程锁时,写线程队列中处于等待状态的下一个线程(如果存在)将被授予写线程锁,依此类推。换句话说,ReaderWriterLock 在一组读线程和一个写线程之间交替进行操作。
6.又想到一个:主线程怎样等待扔进线程池的任务全部执行完。用。net的信号量+waitall不太好用,因为最多只能等待64个线程,上次有人写了一个CountDownLutch,还不赖
.NET 4.0加了大量的轻量级的小类库,如SemaphoreSlim,SpinLock,SpinWait等等,不用像以前那样自己写了
CLR Via C# 2nd上讲每个CPU的最大工作线程数量是25个,你的250是不是写错了
打过.NET 3.5 SP1就变成250了,.NET 2.0是25。
,普通的Windows应用程序(如控制台或WinForm/WPF),会将其设置为“处理器数 * 250”。也就是说,如果您的机器为2个2核CPU,那么CLR线程池的容量默认上限便是1000,也就是说,它最多可以管理1000个线程同时运行——很多情况下这已经是一个很可怕的数字了,如果您觉得这还不够,那么就应该考虑一下您的实现方式是否可以改进了。
SmartThreadPool ThreadPool的改进型,很好的东西。
Math.Round(124.9999) = 125
只有舍入的那一位是5的时候才会考虑前一位的奇偶,也就是说:
Math.Round(124.5) = 124
同时还要考虑后面几位,例如
Math.Round(124.51) = 125
在会财务软件时,最好把金额钱全部换成分,以分来计算
Math.Round不太准确,想要准确,可以使用。
SqlDecimal aa = 123.325m; // 创建一个变量
aa = SqlDecimal.ConvertToPrecScale( aa, 12, 2 );
// 设置变量长度为12位; 小数为2位
只要是金额,它的“基础数据”一定要设置到“分”,个别用户甚至设置到“厘”。
只是在汇总、显示、打印时,可以用到万元单位(小数位按客户需求)。否则,就会出现误差。
这也是经验之谈