Windows IoT Raspberry Pi 3 c # MediaPlayer.mediaEnded

Я новичок в этом. Я пытаюсь сделать проигрыватель аудиосообщений на Rasp Pi 3 с ядром Win IoT. Мне удается воспроизвести аудиофайл с моего USB-накопителя, но мне нужно знать, когда аудиофайл закончил воспроизведение.

 mediaPlayer = new MediaPlayer();
 mediaPlayer.MediaEnded += MediaPlayer_MediaEnded;

 private void MediaPlayer_MediaEnded(MediaPlayer sender, object args)
    {
        GeneralMessage.Text = "Message Complete!";
    }

я получаю сообщение об ошибке с указанным выше кодом.

System.Exception occurred
  HResult=0x8001010E
  Message=The application called an interface that was marshalled for a 
different thread. (Exception from HRESULT: 0x8001010E (RPC_E_WRONG_THREAD))

Пожалуйста помоги.


person mylim    schedule 13.09.2017    source источник
comment
Вы пытаетесь изменить элемент пользовательского интерфейса из потока, который не является потоком пользовательского интерфейса. Обычно вы используете что-то вроде Control.Invoke, чтобы маршалировать эту модификацию в поток пользовательского интерфейса.   -  person Fildor    schedule 13.09.2017
comment
Могу ли я отобразить строку, указывающую на то, что воспроизведение файла завершено?   -  person mylim    schedule 13.09.2017
comment
Да, используйте Invoke для GeneralMessage. Попробую найти пример ...   -  person Fildor    schedule 13.09.2017
comment
docs.microsoft.com/en-us/dotnet/framework/winforms/controls/   -  person Fildor    schedule 13.09.2017
comment
извините за мои знания в C #, могу ли я узнать, как вызвать поток?   -  person mylim    schedule 13.09.2017
comment
Однако не уверен, применимо ли это к ядру Win IoT.   -  person Fildor    schedule 13.09.2017
comment
спасибо .. Я попробую и обновлю здесь, чтобы поделиться.   -  person mylim    schedule 13.09.2017
comment
Я только что увидел, вероятно, это неприменимо. Возможно, это поможет вместо этого: stackoverflow.com/a/38207907/982149 Речь идет об обновлении свойства int, но вы можете используйте Progress ‹string›.   -  person Fildor    schedule 13.09.2017


Ответы (2)


Причина вашей проблемы заключается в том, что изменения пользовательского интерфейса должны быть внесены в поток пользовательского интерфейса, но событие MediaEnded возникает в другом потоке.

В Windows IoT Core при обновлении элемента в пользовательском интерфейсе из другого потока используйте метод Dispatcher.RunAsync.

Task.Run(async () =>
{
     //this part is run on a background thread...

     await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, 
        ()=> 
        {
             //this part is being executed back on the UI thread...
             GeneralMessage.Text = "Message Complete!";
        });
});

Пожалуйста, укажите здесь Медиа-элементы, плейлисты и дорожки. В этой статье показано, как использовать MediaSource, и описаны операции, выполняемые в рамках вызова CoreDispatcher.RunAsync.

person Michael Xu - MSFT    schedule 14.09.2017
comment
Привет, Майкл, спасибо. Но он показывает, что имя Task.Run не существует в текущем контексте. Любая идея? - person mylim; 18.09.2017

Мне удалось решить эту проблему ... код, как показано ниже

private async void MediaPlayer_MediaEnded(MediaPlayer sender, object args)
    {
        await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
        {
            GeneralMessage.Text = "Done playing.";

     });
person mylim    schedule 18.09.2017