2016-01-10 4 views
0

У меня есть проект ASP.Net MVC, и я пытаюсь вызвать некоторые методы из System.Speech. В моем локальном режиме все работает так, как ожидалось, но когда я публикую его в Windows Azure, он выдает исключение NullReferenceException. Это мой код, который бросает исключение (в строке 9):System.Speech не работает на Windows Azure

1  public async static Task<byte[]> ToSpeech(string text) 
2  { 
3   byte[] bytes; 
4   var stream = new MemoryStream(); 
5   await Task.Run(() => 
6     { 
7      using (var speech = new SpeechSynthesizer()) 
8      { 
9        speech.SetOutputToWaveStream(stream); 
10       speech.Speak(text); 
11      } 
12     }); 
13   bytes = ConvertWavToMP3(stream); 
14   return bytes; 
15  } 

Это выброшенное исключение: enter image description here

Edit1

Проблема заключается в SpeechSynthesizer, в моем местном при вызове Конструктор SpeechSynthesizer поля свойства речи инициализируются нормально, но когда я отлаживаю версию публикации после вызова cosntructor, они уже выбрали исключение. enter image description here

ответ

1

Это не имеет ничего общего с лазурным - вы можете получить то же самое на своем компьютере.

Использование ИСПОЛЬЗОВАНИЯ с заданием не имеет смысла. Вы запускаете возможное условие, что ваша задача поставлена ​​в очередь, и, прежде всего, она выполняется с помощью выписки с использованием оператора - недействительной переменной скорости.

Это просто плохой код.

Вы должны в значительной степени выполнять всю обработку в методе выполнения задачи. Это включает создание объекта синтезатора. Просто передайте строку в метод run.

+0

Спасибо за ответ, я согласен с вами, что код не очень хороший, но теперь проблема не в нем. В моем локальном при вызове конструктора SpeechSynthesizer поля речевого свойства инициализируются нормально, но когда я отлаживаю версию публикации после вызова конструктор они уже выбрали исключение. Я только что редактировал мой вопрос и добавил скриншот – Narek

+0

Ну, я говорю вам, что это за ошибка. Вы относитесь к трудным для воспроизведения многопоточным проблемам из-за отсутствия основных принципов. Исправление путем реорганизации вашего кода занимает меньше времени, чем даже запись вашего комментария. Если вы не хотите этого делать - возможно, прочитайте книгу о многопоточном программировании. Ваша переменная имеет значение null, потому что это то, что осталось после того, как оператор using закрывает ее. – TomTom

+0

Я изменил код, результат тот же – Narek