【问题标题】:FileStream BeginWrite or WriteAsync with IsAsyncFileStream BeginWrite 或 WriteAsync 与 IsAsync
【发布时间】:2015-03-18 18:27:16
【问题描述】:

我处于需要从不同线程写入相同文件流的情况。问题是我找不到任何明确的解释是否需要处理写入之间的当前流位置?

我使用 FileOptions.Asynchronous 选项打开流,因此有一个重叠的 IO。

所有写入请求都按顺序进入下一个偏移量的缓冲区,根据我的测试,一切正常,数据在文件偏移量处正确写入。

但如果这种方法没有任何影响,真的有人可以回答。

【问题讨论】:

  • 给出代码,得到答案... ;)
  • “所有写入请求都是按顺序进入的”-听起来您没有重叠的请求-请澄清。显然,如果请求是真正顺序的(意味着下一个写入不会在前一个完成之前开始),您不需要自己管理位置......
  • 不,这不是我的意思,我的意思是所有写入请求都以正确的顺序出现。
  • 使用 (var fs = new FileStream(@"c:\somefile.bin", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite, 4096, FileOptions.Asynchronous)) { var buffer = new字节[65536]; for(int i = 0; i

标签: c# filestream


【解决方案1】:

您可以通过参数将 FileStream 传递给另一个方法。例如:

public void FirstMethod(){
    FileStream filestream = new FileStream();
    //fill filestream
    SecondMethod(filestream);
}

public void SecondMethod(FileStream filestream)
    filestream.//do whatever you want with it
}

或者你可以让一个方法返回文件流:

public FileStream FirstMethod() {
    FileStream filestream = new FileStream();
    //fill filestream
}

public void SecondMethod() {
    FileStream filestream = FirstMethod();
    //do what you want with it
}

如果你能告诉我们你做了什么,我们可以给你一个适合你情况的答案。

【讨论】:

  • 直接来自文档:“不保证任何实例成员都是线程安全的。” (FileStream) - 所以我不会打赌这个工作没有问题
  • 啊,现在我明白了,你想捕捉两种方法写入同一个文件的可能性吗?那我没有给你答案,对不起。
  • 我在我的项目中所做的是使用 MemoryStream 并在我的课程之间传递它,直到我完成它。也许有一种方法可以检查当前是否使用了文件流?比如,if(filestream.inUse == true) { //wait } else { //go ahead }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-06
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2011-06-25
相关资源
最近更新 更多