Большой метод, заставляющий приложение Silverlight переходить в состояние «Не отвечает» - PullRequest
1 голос
/ 02 ноября 2010

Я работаю над приложением, которое воспроизводит видео через объект SilverEle MediaElement.

У меня есть большой метод, который отвечает за следующее

  1. Открывает элемент FileInfo в локальном пути к файлу видео и удаляет имя файла, чтобы получить первую часть имени файла, которое мы используем как часть процесса получения лицензии
  2. Устанавливает LicenseAcquirer на MediaElement
  3. Устанавливает свойство Source MediaElement

Когда этот метод вызывается, он фактически заставляет приложение переходить в состояние «Не отвечает» на пару секунд. Как мне избежать этого? Я пытался поместить все это в фоновый рабочий, но я должен вызывать поток пользовательского интерфейса для почти всех вызовов, и это не помогло, казалось, на самом деле замедляет работу.

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

Это код, вызывающий проблему:

    private void SetupMediaElement(String mediaElementType)
    {
        Messenger.Default.Send("Loading video...", "SetNowWatchingVideoBusyBoxText");
        Messenger.Default.Send(true, "SetNowWatchingVideoBusyBox");
        try
        {
            if (_mainMediaElement != null)
            {
                VideoItem vi = CurrentSession.NowPlayingVideoItem;

                if (vi != null)
                {
                    CurrentVideoItem = vi;
                    MustShowImage = true;

                    if (vi.ID != string.Empty)
                    {
                        String mediaId = String.Empty;
                        if (vi.LocalFilePath != DEMOVIDEOPATH)
                        {
                            if (vi.LocalFilePath != String.Empty)
                            {
                                var fi =
                                    new FileInfo(vi.LocalFilePath);
                                if (fi.Exists)
                                {
                                    mediaId = fi.Name.Substring(fi.Name.LastIndexOf('-') + 1,
                                                                (fi.Name.LastIndexOf('.') -
                                                                 (fi.Name.LastIndexOf('-') + 1)));
                                }
                            }
                            else
                            {
                                Debug.WriteLine("localFilePath is empty");
                            }

                            Debug.WriteLine("MediaId = " + mediaId +
                                            ", SessionId = " +
                                            CurrentSession.LoggedOnUser.SessionId +
                                            ",Ticket = " +
                                            CurrentSession.LoggedOnUser.Ticket);

                            string licenseURL = GetLicenseURL(mediaId, CurrentSession.LoggedOnUser.SessionId,
                                                              CurrentSession.LoggedOnUser.Ticket);
                            if (licenseURL != string.Empty)
                            {
                                var la = new LicenseAcquirer
                                             {
                                                 LicenseServerUriOverride
                                                     =
                                                     new Uri(
                                                     licenseURL)
                                             };

                                la.AcquireLicenseCompleted += la_AcquireLicenseCompleted;
                                _mainMediaElement.LicenseAcquirer = la;
                            }

                            var fileInfo = new FileInfo(vi.LocalFilePath);
                            string playURL = @"file://" +
                                             Path.Combine(CoreConfig.HOME_FULL_PATH, fileInfo.Name);
                            playURL = playURL.Replace("\\", @"/");
                            VideoURL = playURL;
                        }
                        else
                        {
                            VideoURL = vi.LocalFilePath;
                            Messenger.Default.Send(false, "SetNowWatchingVideoBusyBox");
                        }

                        _totalDurationSet = false;
                        TotalTime = FormatTextHoursMinutesSecond(_mainMediaElement.NaturalDuration.TimeSpan);
                        SetSliderPosition();
                    }
                }
                else
                {
                    Messenger.Default.Send(false, "SetNowWatchingVideoBusyBox");
                }
            }
            else
            {
                Messenger.Default.Send(false, "SetNowWatchingVideoBusyBox");
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex);
            VideoURL = DEMOVIDEOPATH;
            Messenger.Default.Send(false, "SetNowWatchingVideoBusyBox");
        }
    }

Спасибо

EDIT: Таким образом, оказывается, что приведенный выше метод НЕ является причиной задержки - этот код выполняется менее чем за секунду. Проблема возникает, когда источник медиа-элемента установлен и он читает файл до конца - большие файлы занимают время, и это задержка. Открываю новый вопрос, основанный на этом.

Ответы [ 2 ]

2 голосов
/ 02 ноября 2010

Вам следует провести некоторую диагностику, чтобы определить, какие строки действительно стоят все это время, маловероятно, что количество времени будет равномерно распределено по всей функции.

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

1 голос
/ 03 ноября 2010

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

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