【问题标题】:Windows IoT Raspberry Pi 3 c# MediaPlayer.mediaEndedWindows IoT Raspberry Pi 3 c# MediaPlayer.mediaEnded
【发布时间】:2018-02-22 05:12:04
【问题描述】:

我是新手。 我正在尝试使用 Win IoT 核心在 Rasp Pi 3 上制作音频消息播放器。 我设法从我的 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))

请帮忙。

【问题讨论】:

  • 您正在尝试从不是 UI 线程的线程修改 UI 元素。通常你会使用“Control.Invoke”之类的东西来将修改编组到 UI 线程。
  • 我是否可以显示一个字符串来指示文件已完成播放?
  • 是的,在 GeneralMessage 上使用 Invoke。我会尝试找到一个例子......
  • 请原谅我对 c# 的了解,我可以知道如何调用线程吗?

标签: c# raspberry-pi raspberry-pi3 windows-iot-core-10


【解决方案1】:

您的问题的原因是,UI 更改必须在 UI 线程上进行,但 MediaEnded 事件是在不同的线程上引发的。

在 windows IoT Core 中,当您从另一个线程更新 UI 中的元素时,请使用 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!";
        });
});

请在此处参考Media items, playlists, and tracks。本文展示了如何使用 MediaSource ,并包含在 CoreDispatcher.RunAsync 调用中执行的操作。

【讨论】:

  • 嗨,迈克尔,谢谢。但它显示“名称 Task.Run 在当前上下文中不存在”。有什么想法吗?
【解决方案2】:

我设法解决了调用的事情..代码如下

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

     });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多