本帖最后由 xipiyou 于 2010-01-15 14:02:38 编辑

解决方案 »

  1.   

    大侠们,快来想想办法.因为web中写文件一般是用于log的时候,所以自己想了个办法,希望各位大侠指点下:
    首先把所有写文件请求全不写到内存中,因为内存比IO速度快很多。然后后台运行一程序,定期把内存中保存的数据一次性写入log文件,并清除内存中已经log下来的部分。
      

  2.   

    没看明白楼主的意思
    并发读文件,肯定不会有什么冲突,但是并发写文件,系统就会异常,通常解决并发写的问题,就是文件写时加锁,当然单纯的lock并非就不异常了,并发写入量再大点,比如几万人在线时候,还是会引发异常,所以比较稳妥的办法,就是不出错的办法,就是写入时开辟多线程进行写入,并且写入时候,先尝试写打开,没人独占时候再写入,这种方法肯定不会有异常,但是可能会有延迟
    另一种办法就是放消息队列里,这种办法也是不错的选择
    还有一种办法就是放缓存中,当然.NET缓存是不靠谱的,可以放在memcached中,然后更新都放入内存中,读取更新也都暂时在内存中进行,最后等服务器空闲的时候,比如晚上得时候,统一的查找更新的缓存键,更新到数据库中
      

  3.   


    简单说,你把写文件的动作放到 System.Threading.ThreadPool.QueueUserWorkItem 的回调方法里就可以了,你不需要设计什么“定期”操作。
      

  4.   

    这个问题,解决方法有很直接的方法。
    篇幅太多了。 你搜搜,.net 2.0 面向对象编程解密
    13章和14章  异步调用   进程和线程,对你 的问题很有帮助。
      

  5.   

    lock(fs)
    {
    ....
    }
    这样不知道成不,以前没搞过
      

  6.   

    其实意思很简单,就是想要个高效、不会出错、不会漏记log的方法。当多线程写入的时候,加入一个进程等待的时间太久了,还是会有异常的,会报:另一个进程已打开文件。类似这样的异常,这样的话,等待超时的那个线程就没有记录到LOG了。
      

  7.   

    在.NET 里面好像是可以的。貌似SQL里面的 表级锁,行级锁吧