Система.UnauthorizedAccessException с преобразованием текста в речь в Windows Phone 8


У меня есть следующий фрагмент кода для использования функции преобразования текста в речь в Windows Phone 8. Я использую ssml, с закладками. Но при изменении любого элемента пользовательского интерфейса в закладке событие, вызванное функцией, вызывает несанкционированное исключение.

private void Initialise_synthesizer()
        {
            this.synthesizer = new SpeechSynthesizer();

            synthesizer.BookmarkReached += new TypedEventHandler<SpeechSynthesizer, SpeechBookmarkReachedEventArgs>
                (BookmarkReached);
        }

void BookmarkReached(object sender, SpeechBookmarkReachedEventArgs e)
        {
            Debugger.Log(1, "Info", e.Bookmark + " mark reachedn");

            switch (e.Bookmark)
            {
                case "START":
                    cur = start;
                    break;
                case "LINE_BREAK":
                    cur++;
                    break;
                }
**error here**  t1.Text = cur.ToString();
            }

Но при запуске он выдает следующую ошибку

A first chance exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.ni.dll
An exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.ni.dll and wasn't handled before a managed/native boundary
Invalid cross-thread access.

Любая идея, как исправить эту ошибку, или любая работа вокруг.

3 2

3 ответа:

Только что получил ответ.

Поскольку synthesizer.SpeakSsmlAsync() является асинхронной функцией, для выполнения операций пользовательского интерфейса должен использоваться Диспетчер, что-то вроде этого -

Dispatcher.BeginInvoke(() =>
                t1.Text = cur.ToString());

Это в значительной степени не связано с распознаванием речи. Похоже, что это связано с доступом к элементам, которые находятся в потоке пользовательского интерфейса из другого потока.

Попробуйте это:

Dispatcher.BeginInvoke(() => 
    {
        t1.Text = cur.ToString();
    }
);

Из AppManifest.XML, в свою очередь, на ID_CAP_SPEECH_RECOGNITION возможность.