Исключение нулевой ссылки c# с System.Speech.Synthesis при использовании в большом приложенииC#

Место общения программистов 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 имеет строковый тип. Брокер сообщений использует делегатов для вызова подписчиков, когда издатель публикует экземпляр объекта. Этот объект содержит строку для произнесения, а действие, которое зарегистрировано/подписано на брокера сообщений, извлекает строку из сообщения, а затем вызывает приведенный выше код, чтобы разрешить ее чтение. Я совершенно озадачен тем, почему я могу реализовать эту работу буквально где угодно, кроме ядра этого более крупного приложения.
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»