Выход из состояния 3221225477 при «высокой нагрузке» (когда запущено несколько десятков экземпляров программы) - PullRequest
0 голосов
/ 05 июня 2019

Я называю этот скомпилированный exe из другой программы Go - для синтеза звука в Windows.SpVoice() но не проще SpeechSynthesizer API из-за потрескивания в звуке .Все работает нормально, но когда у меня параллельно не десять, а несколько десятков копий этой программы (каждая вызывается из программы), иногда я получаю 3221225477. Мой код C #:

using System;

using System.Runtime.Serialization;

using SpeechLib;

class Program {
    static SpVoice synth = new SpVoice();
    static SpMemoryStream wave = new SpMemoryStream();

    static void Main(string[] args) {
        synth.AudioOutputStream = wave;

        // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms720595(v%3Dvs.85)
        wave.Format.Type = SpeechAudioFormatType.SAFT44kHz16BitMono;

        using (var stdin = Console.OpenStandardInput()) {
            using (var stdout = Console.OpenStandardOutput()) {
                var m = (Message)new System
                    .Runtime
                    .Serialization
                    .Json
                    .DataContractJsonSerializer(typeof(Message)).ReadObject(stdin);

                // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms722610(v%3dvs.85)
                foreach(SpObjectToken voice in synth.GetVoices()) {

                    if (voice.GetDescription().Contains(m.Voice)) {
                        synth.Voice = voice;
                    }
                }

                synth.Speak(m.Text);

                var wavBytes = (byte[])wave.GetData();
                stdout.Write(wavBytes, 0, wavBytes.Length);
            }
        }

        wave = new SpMemoryStream();  // Withoit reinit will concatenate
        synth.AudioOutputStream = wave;

    }
}

[DataContract]
class Message {
    [DataMember]
    public string Voice { get; set; }

    [DataMember]
    public string Text { get; set; }
}

I найдено , что 3221225477 означает STATUS_ACCESS_VIOLATION.Я пытался попробовать / поймать все и записать в журналы, но при таком выходе я не нашел записей в Event Viewer.Я запускаю это на Windows Server 2019 в Google Cloud.

Обновление: я обнаружил, что Wav вернулся из stdout даже при этой ошибке.

...