C#文件流在线程中变得紧密 main(字符串[]参数){ 字符串文件=@“D:\123.txt”; 使用(FileStream f=File.Open(File,FileMode.Open,FileAccess.Read,FileShare.Read)) { f、 位置=0; 星形螺纹(f); } } //这是一个供用户使用的公共API 公共静态线程StartReadBookThread(流) { Console.WriteLine(“CanSeek:+stream.CanSeek”); var t=新线程(()=>DoReadBook(流)); t、 Start(); 返回t; } 私有静态void DoReadBook(流) { Console.WriteLine(“CanSeek:+stream.CanSeek”); }

C#文件流在线程中变得紧密 main(字符串[]参数){ 字符串文件=@“D:\123.txt”; 使用(FileStream f=File.Open(File,FileMode.Open,FileAccess.Read,FileShare.Read)) { f、 位置=0; 星形螺纹(f); } } //这是一个供用户使用的公共API 公共静态线程StartReadBookThread(流) { Console.WriteLine(“CanSeek:+stream.CanSeek”); var t=新线程(()=>DoReadBook(流)); t、 Start(); 返回t; } 私有静态void DoReadBook(流) { Console.WriteLine(“CanSeek:+stream.CanSeek”); },c#,filestream,C#,Filestream,在DoReadBook方法中,流变为关闭,CanSeek变为false。 如果我想在线程中读取流,如何处理它 一般的方法是我们为用户提供一个公共API StartReadBookThread,它在一个线程中运行。 用户我们总是喜欢在建议使用()中调用参数文件流{}。。。对。 那么,我们如何才能以更好的方式读取文件。 你知道我们只是在一个线程中执行,有时它可能会被关闭。当StartReadBookThread返回并且你在main中点击using语句中的}时,流被释放 您的工作流程基本上是: 买一台

DoReadBook
方法中,流变为关闭,
CanSeek
变为false。
如果我想在线程中读取流,如何处理它 一般的方法是我们为用户提供一个公共API StartReadBookThread,它在一个线程中运行。 用户我们总是喜欢在建议使用()中调用参数文件流{}。。。对。 那么,我们如何才能以更好的方式读取文件。
你知道我们只是在一个线程中执行,有时它可能会被关闭。

StartReadBookThread
返回并且你在
main
中点击using语句中的
}
时,流被释放

您的工作流程基本上是:

  • 买一台割草机(
    FileStream
  • 请一名工人修剪草坪(
    线程
  • 立即归还割草机(
    使用
    语句)
  • 期望工人继续用你不再有的割草机割草(错误的期望)

  • 您需要等待从函数StartReadBookThread返回的线程 请查看更新的代码段

        main(string[] args)
        {
            string file = @"D:\123.txt";
    
            using (FileStream f = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                f.Position = 0;
                var t = StartReadBookThread(f);
                t.Join(); // wait on the thread
            }
        }
    
        private static Thread StartReadBookThread(Stream stream)
        {
            Console.WriteLine("CanSeek:" + stream.CanSeek);
            var t = new Thread(() => DoReadBook(stream));
            t.Start();
            return t;
        }
    

    我想要这个代码,你为什么不在线程中打开流呢?你的整个代码让我很困惑,如果
    CanSeek
    false
    ,那么你会在
    f.Position=0
    上得到一个异常,但是你要先这样做:在你检查之前。@John在
    startreadbookshread
    返回后,流就关闭了,这通常是在运行
    DoReadBook
    之前。@John我只是在解决您对
    f.Position=0
    的困惑,这很好。CanSeek稍后将变为false。StartReadBookThread是一个公共API。生成新线程只是为了立即冻结原始线程有什么意义?不妨在原始线程上进行工作。@GSerg是的,你是对的,我为他的问题提供了解决方案。我知道这不是做流处理的正确方法。我知道有更好的方法可以做到这一点。
      using (FileStream f = File.Open(file, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
    
                       var stream = new MemoryStream();
                       f.Position = 0;
                       f.CopyTo(stream);
                        StartReadBookThread(stream );
            }