C#:FileStream.ReadByte()是多线程友好函数吗?

问题描述 投票:0回答:1

所以我有16个线程同时运行此方法:

    private void Work()
    {
        int currentByte;
        char currentChar;

        try
        {
            while (true)
            {
                position++;
                currentByte = file.ReadByte();
                currentChar = Convert.ToChar(currentByte);

                entries.Add(new Entry(currentChar));
            }
        }
        catch (Exception) { }
    }

然后我还有一个线程正在运行此方法:

    private void ManageThreads()
    {
        bool done;

        for(; ; )
        {
            done = !threads.Any(x => x.IsAlive == true);//Check if each thread is dead before continuing
            if (done)
                break;
            else
                Thread.Sleep(100);
        }
        PrintData();
    }

这里是问题:PrintData方法仅将“条目”列表中的所有内容打印到文本文件。每次使用相同的输入文件运行程序时,此文本文件都会有所不同。对于多线程应用程序,我有点菜鸟,请随时提出批评。

c# multithreading linq filestream
1个回答
0
投票

通常,除非类型在其文档中明确声明了线程安全性,否则应假定它不是线程安全的*。 .Net中的流没有此部分,因此应将其视为非线程安全的-使用适当的同步(即锁),以确保每次从一个线程访问每个流。

[使用文件流,还有另一个问题-操作系统级别的文件对象可能会从其他线程更新-FileStream尝试通过检查其内部状态是否与OS状态匹配来减轻它的负担-请参见MSDN上的FileStream:remarks部分。

如果想要线程安全的流,可以尝试使用Synchronized中所示的C#, is there such a thing as a "thread-safe" stream?方法。

请注意,无论流是否是线程安全的,您发布的代码都会产生随机结果。流的线程安全性只能保证所有字节都显示在输出中。如果使用非线程安全流,则根本无法保证,某些字节可能会多次显示,某些字节可能会跳过,并且其他行为(崩溃,部分读取等)都是可能的。


*线程安全,如“实例的内部状态是一致的,无论是从一个线程还是从多个线程调用”。 不是表示从不同线程调用任意方法将导致有用的行为。

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