首页 新闻 会员 周边 捐助

c# 异步求高手呀!!!

0
悬赏园豆:10 [待解决问题]

使用...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);

因为是异步的,怎样确保在写入的过程中别的线程不能写入文件,只能等待.不报异常!!!???

KeVinDurant的主页 KeVinDurant | 初学一级 | 园豆:5
提问于:2013-04-14 12:42
< >
分享
所有回答(6)
0

使用一些同步基元,比如lock

滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-14 12:51

lock也没有用吧。我是异步的。如果写文件耗时很长。。lock的这个线程也不会等待呀。。别的线程还是可以进来的呀!!!

支持(0) 反对(0) KeVinDurant | 园豆:5 (初学一级) | 2013-04-14 17:13

@KeVinDurant: 写的时候可以同步。可以考虑把你读的数据缓存起来,读完一项就同步的去写。

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-14 18:37

@滴答的雨: 以前的做法总是开多一个线程去操作IO,然后在代码中加个lock,这样可以 保证主线程不卡死..

现在是要使用FileStream这个对象进来日志的(异步读和写)(不想重新开一个线程) 方法为BeginWrite,但是考虑到如果写入的文件的内容过大,如果这个时候有另一个进程也准备写入该文件(如果有正在写入文件的线程.必须等待.又要保证界面不卡死..)..因为使用了异步的方式,所以lock感觉没有用了.怎样解决这个问题呢??

支持(0) 反对(0) KeVinDurant | 园豆:5 (初学一级) | 2013-04-14 19:46

@KeVinDurant: BeginWrite实际上是使用线程池线程执行。他向硬件发出写指令后线程不会阻塞而是退回给线程池了,当硬件写完触发回调再用线程池线程执行(两个地方的线程id可能不一样)。。。所以,你不会有线程阻塞消耗内存,你若要保证BeginWrite不被别的线程干扰,应该去判断被写文件是否正被使用(可以通过复制文件的指令去判断),或则自己加一个标识在BeginWrite的时候+1,在回调函数中-1

支持(0) 反对(0) 滴答的雨 | 园豆:3660 (老鸟四级) | 2013-04-14 23:23
0

对线程加锁

不负春光,努力生长 | 园豆:1382 (小虾三级) | 2013-04-14 14:35
0

private static readonly object _sync = new object();

lock(_sync)

{

  操作文件

}

chenping2008 | 园豆:9836 (大侠五级) | 2013-04-14 21:58

lock里面都使用了异步操作了。。你觉得还有用嘛??

支持(0) 反对(0) KeVinDurant | 园豆:5 (初学一级) | 2013-04-14 22:47

@KeVinDurant: 

有用。

支持(0) 反对(0) luofer | 园豆:468 (菜鸟二级) | 2013-04-15 17:17
1

lock本身就是专治各种异步。试过就知道,没必要妄加猜测。

arg | 园豆:1047 (小虾三级) | 2013-04-15 23:06
0

lock 吧 lock定义的代码段为互斥段http://www.cnblogs.com/qiantuwuliang/archive/2009/12/27/1633508.html看看这篇文章,希望能解决你的问题

Aiolos丶M | 园豆:353 (菜鸟二级) | 2013-06-20 11:17
0

线程读写锁,System.Threading空间下找

andy1987 | 园豆:490 (菜鸟二级) | 2013-09-04 19:54
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册