【发布时间】:2013-08-01 12:32:35
【问题描述】:
给定一个写入文本文件的方法
public void WriteToFile( ) {
var file = "C:\\AsyncTest.txt";
var writer = File.Exists( file ) ? File.AppendText( file ) : File.CreateText( file );
writer.WriteLine( "A simulated entry" );
writer.Close();
}
我需要模拟一个场景,这个方法可以循环调用,可能几十次,并且必须异步运行。
所以我尝试像这样在一个新线程中调用该方法(其中 writer 是 WriteToFile 所在的类)
//in a loop...
Thread thread = new Thread( writer.WriteToFile );
thread.Start( );
这一次可以完美运行,但会引发 IO 异常,表明该文件正在被另一个进程在后续迭代中使用。实际上,这完全有道理,但我不知道如何解决它。
我尝试像这样使用 Join()
Thread thread = new Thread( writer.WriteToFile );
thread.Start( );
thread.Join();
但这会锁定调用线程,直到所有加入的线程完成,这有点违背了目的,不是吗?
我尝试使用ThreadPool.QueueUserWorkItem(writer.WriteToFile);,但得到相同的 IO 异常。
我试过用锁
private object locker = new object();
public void WriteToFile( ) {
lock(locker){
//same code as above
}
}
但这并没有明显的效果
我也尝试使用 Task 类,但无济于事。
那么我怎样才能“堆叠”这些后台线程以写入单个文件而不会发生冲突,同时又不会锁定调用线程?
【问题讨论】:
-
尝试在线程内部锁定一个全局(静态)变量,并在锁定结束之前(如 100 毫秒)添加一个轻微的睡眠(Windows 问题与打开和关闭文件)。
-
一个文件还是多个文件?你要写的是固定的还是作为参数传递的?
-
stackoverflow.com/questions/10519853/… 这对解锁文件有帮助吗?
-
使用任务。然后您可以使用ContinueWith 来排队下一个操作,依此类推。
-
您打开文件的方式不可以异步写入同一个文件。