C#文件流在线程中关闭

问题描述 投票:-2回答:3
main(string[] args) {
    string file = @"D:\123.txt";

    using (FileStream f = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read))
    {
        f.Position = 0;
        StartReadBookThread(f);
    }   
}
//this is a public API for user
public static Thread StartReadBookThread(Stream stream)
{
    Console.WriteLine("CanSeek:" + stream.CanSeek);
    var t = new Thread(() => DoReadBook(stream));
    t.Start();
    return t;
}

private static void DoReadBook(Stream stream)
{
    Console.WriteLine("CanSeek:" + stream.CanSeek);
}

DoReadBook方法中,流关闭,CanSeek变为假。如果我想在线程中读取流,如何处理通常的方法是我们为用户提供公共API StartReadBookThread,它在线程中运行。用户,我们总是喜欢以建议using(){} ...的方式调用参数文件流。因此我们如何更好地读取文件。您知道我们只是在线程中执行此操作,有时它可能会关闭。

c# filestream
3个回答
5
投票

StartReadBookThread返回并在}的using语句中击中main时,您的流被处置。

您的工作流程基本上是:

  1. [购买割草机(FileStream)。
  2. 问一个工人割草(Thread)。
  3. 立即返回割草机(using语句。
  4. 希望工人继续用您不再拥有的割草机割草(错误的期望。)>

0
投票
  using (FileStream f = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read))
        {

                   var stream = new MemoryStream();
                   f.Position = 0;
                   f.CopyTo(stream);
                    StartReadBookThread(stream );
        }  

-1
投票

您需要等待从功能StartReadBookThread返回的线程请查看更新的代码段。

© www.soinside.com 2019 - 2024. All rights reserved.