使用...FileStream异步写入文件
fs.BeginWrite(bt, 0, bt.Length, state =>
{
FileStream fsEnd = state.AsyncState as FileStream;
if (fsEnd != null)
{
fsEnd.EndWrite(state);
fs.Flush();
Console.WriteLine("异步写入数据成功!");
}
}, fs);
因为是异步的,怎样确保在写入的过程中别的线程不能写入文件,只能等待.不报异常!!!???
使用一些同步基元,比如lock
lock也没有用吧。我是异步的。如果写文件耗时很长。。lock的这个线程也不会等待呀。。别的线程还是可以进来的呀!!!
@KeVinDurant: 写的时候可以同步。可以考虑把你读的数据缓存起来,读完一项就同步的去写。
@滴答的雨: 以前的做法总是开多一个线程去操作IO,然后在代码中加个lock,这样可以 保证主线程不卡死..
现在是要使用FileStream这个对象进来日志的(异步读和写)(不想重新开一个线程) 方法为BeginWrite,但是考虑到如果写入的文件的内容过大,如果这个时候有另一个进程也准备写入该文件(如果有正在写入文件的线程.必须等待.又要保证界面不卡死..)..因为使用了异步的方式,所以lock感觉没有用了.怎样解决这个问题呢??
@KeVinDurant: BeginWrite实际上是使用线程池线程执行。他向硬件发出写指令后线程不会阻塞而是退回给线程池了,当硬件写完触发回调再用线程池线程执行(两个地方的线程id可能不一样)。。。所以,你不会有线程阻塞消耗内存,你若要保证BeginWrite不被别的线程干扰,应该去判断被写文件是否正被使用(可以通过复制文件的指令去判断),或则自己加一个标识在BeginWrite的时候+1,在回调函数中-1
对线程加锁
private static readonly object _sync = new object();
lock(_sync)
{
操作文件
}
lock里面都使用了异步操作了。。你觉得还有用嘛??
@KeVinDurant:
有用。
lock本身就是专治各种异步。试过就知道,没必要妄加猜测。
lock 吧 lock定义的代码段为互斥段http://www.cnblogs.com/qiantuwuliang/archive/2009/12/27/1633508.html看看这篇文章,希望能解决你的问题
线程读写锁,System.Threading空间下找