Я работаю над приложением, которое воспроизводит видео через объект SilverEle MediaElement.
У меня есть большой метод, который отвечает за следующее
- Открывает элемент FileInfo в локальном пути к файлу видео и удаляет имя файла, чтобы получить первую часть имени файла, которое мы используем как часть процесса получения лицензии
- Устанавливает LicenseAcquirer на MediaElement
- Устанавливает свойство 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:
Таким образом, оказывается, что приведенный выше метод НЕ является причиной задержки - этот код выполняется менее чем за секунду. Проблема возникает, когда источник медиа-элемента установлен и он читает файл до конца - большие файлы занимают время, и это задержка. Открываю новый вопрос, основанный на этом.