日期:2014-05-20  浏览次数:20891 次

多线程操作同一个文件,向文件写数据,能不能实现?
这个问题已经困扰我好久了,请各位高手帮忙,先谢谢大家了
我的线程是单独放在一个类里面,通过创建这个类的对象来创建线程,本来想用锁来控制线程,但是线程是在不同对象里的,所以没法控制,用lock,mutex,monitor都没用,但现在又遇到多线程写同一个文件这个问题,真是这个问题搞死了,
我的结构如下:
class   A
{
    ..........
    private   void   bt_select_Click(object   sender,   System.EventArgs   e)
    {
        ....
        for(int   i=0;i <xmllist.Count;i++)
        {
              B   b=new   B(xmllist[i],i);
        }
        ....
    }
    ..........
}


Class   B
{
    ......
    public   B(string   ip,string   i)
    {
        Thread   thd   =   new   Thread(new   ThreadStart(ExcuteImport));
        j=i+1;
        thd.Name= "线程 "+j+ ",支队ip: "+ip;
        sb_log.Append( "/*******************************/ ");
        sb_log.Append( "【 "+thd.Name+ "】 ");
        thd.Start();
    }
    .......
    private   void   writeFileLog()
    {
        DateTime   dt=DateTime.Now;
        FileStream   fs;
        string   path=Directory.GetCurrentDirectory()+ "\\log\\ ";
        string   filename=dt.ToString( "d ")+ ".log ";
        StreamWriter   writeFileLog;

        if(!Directory.Exists(path))
        {
Directory.CreateDirectory(path);
        }
        fs=new   FileStream(path+filename,FileMode.OpenOrCreate,FileAccess.Write,FileShare.ReadWrite);

        writeFileLog=new   StreamWriter(fs);
        writeFileLog.Write(sb_log);
        writeFileLog.Close();
        fs.Close();
      }
}

------解决方案--------------------
可以啊 异步操作
------解决方案--------------------
要用lock 在同一时刻只能有一个线程写该文件
------解决方案--------------------
要确保同一时刻只能有一个线程操作该文件。。。。
------解决方案--------------------
线程同步一定要小心呀
------解决方案--------------------
lock吧...
不过我上个程序里面发现有lock锁不住的东西...........
------解决方案--------------------
.NET Framework 类库
FileOptions 枚举
注意:此枚举在 .NET Framework 2.0 版中是新增的。

表示用于创建 FileStream 对象的附加选项。

成员名称 说明
Asynchronous 指示文件可用于异步读取和写入。

public FileStream(string path, FileMode mode, FileAccess access, FileShare share, int bufferSize, FileOptions options);


------解决方案--------------------
可以将所有写文件的操作交给一个线程来做,其他来调用并Lock
------解决方案--------------------