Zapis pliku wymaga zoptymalizowania pod kątem ciężkiego ruchu 3

to pytanie jest kontynuacją pierwszej części, każdy, kto jest zainteresowany, skąd pochodzę, może odwołać się do części 1 i części 2, ale nie jest to konieczne.

zapis pliku należy zoptymalizować pod kątem dużego ruchu

Zapis pliku wymaga zoptymalizowania pod kątem ciężkiego ruchu części 2

teraz mam fragment roboczy, odpowiednia część znajduje się poniżej:

    public static class memoryStreamClass
    {
        static MemoryStream ms1 = new MemoryStream();

        public static void fillBuffer(string outputString)
        {
            byte[] outputByte = Encoding.ASCII.GetBytes(outputString);

            ms1.Write(outputByte, 0, outputByte.Length);

            if (ms1.Length > 8100)
            {
                emptyBuffer(ms1);
                ms1.SetLength(0);
                ms1.Position = 0;
            }
        }

        static void emptyBuffer(MemoryStream ms)
        {
            FileStream outStream = new FileStream("c:\\output.txt", FileMode.Append);

            ms.WriteTo(outStream);
            outStream.Flush();
            outStream.Close();
        }

powyższy fragment działa dobrze, a błąd jest wolny. generuje około 8 KB danych przy każdym zapisie.

Teraz staram się wielowątkować powyższy kod, aby zwiększyć wydajność wąskiego gardła zapisu IO i pojawiły się problemy. Poniższy fragment jest tym, co próbowałem spróbować.

Zasadniczo mam 2 identyczne MemoryStream, jeśli powiedzmy, że ms1 jest pełny, zapisuje ms1 do pliku i przełącza na ms2, podczas gdy ms1 pisze, i odwrotnie.

    public static class memoryStreamClass
    {
        static MemoryStream ms1 = new MemoryStream();
        static MemoryStream ms2 = new MemoryStream();
        static int c = 1;

        public static void fillBuffer(string outputString)
        {
            byte[] outputByte = Encoding.ASCII.GetBytes(outputString);

            if (c == 1)
            {
                ms1.Write(outputByte, 0, outputByte.Length);

                if (ms1.Length > 8100)
                {
                    c = 2;

                    Thread thread1 = new Thread( () => emptyBuffer(ms1));
                    thread1.Start();

                    ms1.SetLength(0);
                    ms1.Position = 0;
                }
            }
            else
            {
                ms2.Write(outputByte, 0, outputByte.Length);

                if (ms2.Length > 8100)
                {
                    c = 1;

                    Thread thread2 = new Thread(() => emptyBuffer(ms2));
                    thread2.Start();

                    ms2.SetLength(0);
                    ms2.Position = 0;

                }
            }
        }

powyższy kod może się kompilować i uruchamiać, jednak zapis wyjściowy nie zawsze wynosi 8 KB i zapisuje się zbyt często (niż mój program z pojedynczym wątkiem). czy ktoś może mi oświecić i wskazać, co jest nie tak z moim programem? Dziękuję Ci bardzo

questionAnswers(1)

yourAnswerToTheQuestion