Любая информация о том, почему Media Player блокирует ввод интерфейса на 30 секунд - PullRequest
0 голосов
/ 27 марта 2019

Я запускаю короткое видео в своем приложении UWP, в то время как ряд других задач выполняется в фоновом режиме.Если пользователь не хочет смотреть видео, для него есть кнопка «Пропустить видео».Однако кнопка не становится активной в течение 30 секунд в видео.

Я подумал, что, возможно, это были мои фоновые задачи, блокирующие пользовательский интерфейс, но они выполняются через 5-7 секунд.Я также подумал, что, возможно, проблема была в загрузке видео, но она длилась всего 3 минуты, поэтому я не думаю, что это займет так много времени для буферизации.

Вот XAML, который я используюдля страницы:

<Page
    x:Class="Cgs.Ux.Views.MainMenu"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Cgs.Ux"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:userControls="using:Cgs.Ux.UserControls"
    xmlns:help="using:Cgs.Ux.UserControls.Help"
    mc:Ignorable="d"
    Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

    <RelativePanel RequestedTheme="Light">
        <Image Source="{x:Bind Vm.PlainBackgroundImage, Mode=OneWay, Converter={StaticResource ImageConverter}}"
               Stretch="Fill"/>
        <Viewbox RelativePanel.AlignBottomWithPanel="True" RelativePanel.AlignTopWithPanel="True"
                 RelativePanel.AlignLeftWithPanel="True" RelativePanel.AlignRightWithPanel="True">
            <Grid>
                <Image Source="{x:Bind Vm.BackgroundImage, Mode=OneWay, Converter={StaticResource ImageConverter}}"
                       RelativePanel.AlignVerticalCenterWithPanel="True" RelativePanel.AlignHorizontalCenterWithPanel="True"
                       Height="1080" Width="1920" Opacity=".5"/>
                <!--Media Player-->
                <MediaPlayerElement
                    Name="MediaSimple"
                    Source="ms-appx:///Assets/Videos/Transfer Items Alpha 2.mp4"
                    Width="1920" Height="1080" AutoPlay="False" Visibility="Collapsed">
                </MediaPlayerElement>
                <Button
                    Name="SkipVideo"
                    VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="30"
                    Content="Skip Video" Height="100" Width="400" Background="White"
                    Visibility="{x:Bind Vm.SkipVideoVisible, Mode=OneWay}"
                    PointerEntered="OnPointerEntered"
                    Click="{x:Bind Vm.SkipVideo}"/>
            </Grid>
        </Viewbox>
        <ProgressRing
            RelativePanel.AlignHorizontalCenterWithPanel="True" RelativePanel.AlignVerticalCenterWithPanel="True"
            Width="100" Height="100" Foreground="NavajoWhite" IsActive="{x:Bind Vm.IsBusy, Mode=OneWay}" />
    </RelativePanel>
</Page>

Вот соответствующий код:

public void PlayMedia()
{
    MediaSimple.MediaPlayer.Play();
    MediaSimple.Visibility = Visibility.Visible;
}

public void SkipVideo()
{
    View.StopVideo();
    _introVideoFinished = true;
    if (_soloGameLoaded && _introVideoFinished) GotoGame();
}

private void OnPointerEntered(object sender, PointerRoutedEventArgs e)
{
    Debug.WriteLine("Pointer Entered");
}

Я ожидаю, что кнопка должна быть доступна немедленно или почти сразу.

1 Ответ

1 голос
/ 30 марта 2019

Я пытался создать отдельный проект, чтобы повторить проблему. К сожалению, мои автономные проекты все работали отлично. Разница между моим отдельным проектом и моим провальным проектом заключалась в фоновых задачах, которые я запускал во время запуска видео.

Моя первоначальная идея о том, что фоновые задачи блокировали пользовательский интерфейс, была намечена. Я изменил фоновые задачи для запуска в отдельном потоке, и медиаплеер и кнопки пропуска видео работали отлично.

После перемещения фоновых задач в их собственный поток приложение начало сбой при ошибках Marshalling, поскольку фоновая задача пыталась установить связь с пользовательским интерфейсом. Это объясняет, почему фоновая задача блокировала пользовательский интерфейс на срок до 30 секунд, тогда как ожидалось, что она будет выполнена через 5-7 секунд.

Мораль этой истории: не запускайте фоновые задачи в потоке пользовательского интерфейса и ожидайте, что ваш пользовательский интерфейс будет работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...