首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

===== System.IO.File.AppendAllText 多线程下有点不靠谱 啊====解决方案

2012-05-22 
System.IO.File.AppendAllText 多线程下有点不靠谱 啊,以下代码都是asp.net,我能预见到,如果多

===== System.IO.File.AppendAllText 多线程下有点不靠谱 啊,====
以下代码都是asp.net,我能预见到,如果多个客户端并发访问下面这个页面,asp.net从线程池中分配一个空闲的线程去服务这个请求。也就是可能存在多个线程并发访问log.txt文件。

C# code
 protected void Page_Load(object sender, EventArgs e)        {            string path = Server.MapPath("~/log.txt");            for (int i = 0; i < 100000; i++)            {                System.IO.File.AppendAllText(path, i.ToString());            }        }


所以,我想那当然的加上了lock

C# code
object locker = new object();        protected void Page_Load(object sender, EventArgs e)        {            string path = Server.MapPath("~/log.txt");            lock (locker)            {                for (int i = 0; i < 100000; i++)                {                    System.IO.File.AppendAllText(path, i.ToString());                }                                           }        }


结果发现,出现文件被其它进程占用的IOException.

这时,我又想,ReaderWriterLock锁应该是解决此类问题的。所以又改成了这样的代码:

C# code
protected void Page_Load(object sender, EventArgs e)        {            string path = Server.MapPath("~/log.txt");            System.Threading.ReaderWriterLock rwl = new System.Threading.ReaderWriterLock();            rwl.AcquireWriterLock(1000);            for (int i = 0; i < 100000; i++)            {                System.IO.File.AppendAllText(path, i.ToString());            }            rwl.ReleaseWriterLock();                   }


结果,涛声依旧。。。我有几点不明白:

1\.net设计准则中说,可以确保所有静态方法是线程安全的,为什么这里却出现这种情况。

2、如果一定要采用这个静态方法,有什么办法可以确保多个线程访问不会出现以上问题。谢谢。

[解决办法]
你应该先看下msdn 中关于lock 的部分

然后和自己程序比对下 就会找到原因。
[解决办法]
static object locker = new object();

你这个锁应该是个静态的,才能保证唯一吧


[解决办法]
Best practice is to define a private object to lock on, or a private static object variable to protect data common to all instances
[解决办法]
顶着,LZ 精神可嘉
[解决办法]
明显,你对于线程安全理解有问题.
15楼给解释了.

探讨

to:hwbox
to:Sandy945

此类型(System.IO.File)的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。

既然这个方法本身是线程安全的,我们为什么要加锁?

热点排行