Исключение нулевой ссылки c# с System.Speech.Synthesis при использовании в большом приложении ⇐ C#
Исключение нулевой ссылки c# с System.Speech.Synthesis при использовании в большом приложении
У меня возникла интересная проблема, и мне нужна помощь, чтобы понять, почему это происходит и как это исправить. Вот очень простой базовый класс, который использует System.Speech.Synthesis с .net 8 для преобразования текста в речь.
публичный класс TextToSpeechImpl { частный статический TextToSpeechImpl? s_instance = ноль; частный статический объект только для чтения s_instanceLock = new(); частный только для чтения SpeechSynthesizer _synth = new(); частный TextToSpeechImpl() { _synth.SetOutputToDefaultAudioDevice(); _synth.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult); } общедоступный статический экземпляр TextToSpeechImpl { получать { блокировка (s_instanceLock) { s_instance ??= новый TextToSpeechImpl(); вернуть s_instance; } } } public void Say(текстовая строка) { _synth.Speak(текст); } } Это шаблон проектирования Singleton. Когда я использую это в консольном приложении, оно работает так, как ожидалось. Когда я использую его в форме, он работает так, как ожидалось. Когда я добавляю его в гораздо более крупный проект, который включает в себя как webapi, так и форму, используя шаблон проектирования messagebroker для выполнения функций в различных подсистемах более крупного приложения (разрешенное чтение текста является одной из этих подсистем, я получаю исключение NullReferenceException в этой строке: _synth.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult); Если я удалю эту строку, я получу исключение при вызове функции Speak. Брокер сообщений также является одноэлементным и выполняет команды-посредники между подсистемами. Эта конкретная функция выполняется следующим образом:
TextToSpeechImpl.Instance.Say(msg); Где msg имеет строковый тип. Брокер сообщений использует делегатов для вызова подписчиков, когда издатель публикует экземпляр объекта. Этот объект содержит строку для произнесения, а действие, которое зарегистрировано/подписано на брокера сообщений, извлекает строку из сообщения, а затем вызывает приведенный выше код, чтобы разрешить ее чтение. Я совершенно озадачен тем, почему я могу реализовать эту работу буквально где угодно, кроме ядра этого более крупного приложения.
У меня возникла интересная проблема, и мне нужна помощь, чтобы понять, почему это происходит и как это исправить. Вот очень простой базовый класс, который использует System.Speech.Synthesis с .net 8 для преобразования текста в речь.
публичный класс TextToSpeechImpl { частный статический TextToSpeechImpl? s_instance = ноль; частный статический объект только для чтения s_instanceLock = new(); частный только для чтения SpeechSynthesizer _synth = new(); частный TextToSpeechImpl() { _synth.SetOutputToDefaultAudioDevice(); _synth.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult); } общедоступный статический экземпляр TextToSpeechImpl { получать { блокировка (s_instanceLock) { s_instance ??= новый TextToSpeechImpl(); вернуть s_instance; } } } public void Say(текстовая строка) { _synth.Speak(текст); } } Это шаблон проектирования Singleton. Когда я использую это в консольном приложении, оно работает так, как ожидалось. Когда я использую его в форме, он работает так, как ожидалось. Когда я добавляю его в гораздо более крупный проект, который включает в себя как webapi, так и форму, используя шаблон проектирования messagebroker для выполнения функций в различных подсистемах более крупного приложения (разрешенное чтение текста является одной из этих подсистем, я получаю исключение NullReferenceException в этой строке: _synth.SelectVoiceByHints(VoiceGender.Female, VoiceAge.Adult); Если я удалю эту строку, я получу исключение при вызове функции Speak. Брокер сообщений также является одноэлементным и выполняет команды-посредники между подсистемами. Эта конкретная функция выполняется следующим образом:
TextToSpeechImpl.Instance.Say(msg); Где msg имеет строковый тип. Брокер сообщений использует делегатов для вызова подписчиков, когда издатель публикует экземпляр объекта. Этот объект содержит строку для произнесения, а действие, которое зарегистрировано/подписано на брокера сообщений, извлекает строку из сообщения, а затем вызывает приведенный выше код, чтобы разрешить ее чтение. Я совершенно озадачен тем, почему я могу реализовать эту работу буквально где угодно, кроме ядра этого более крупного приложения.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как исправить исключение нулевой ссылки в переменной изображения в инспекторе?
Anonymous » » в форуме C# - 0 Ответы
- 10 Просмотры
-
Последнее сообщение Anonymous
-