Большой метод, заставляющий приложение Silverlight переходить в состояние "Не отвечает"
Я работаю над приложением, которое воспроизводит видео через объект 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");
}
}
Спасибо
РЕДАКТИРОВАТЬ: Таким образом, оказывается, что приведенный выше метод не является причиной задержки - этот код выполняется менее чем за секунду. Проблема возникает, когда источник медиа-элемента установлен и он читает файл до конца - большие файлы занимают время, и это задержка. Открываю новый вопрос, основанный на этом.
2 ответа
Таким образом, оказывается, что приведенный выше метод НЕ является причиной задержки - этот код выполняется менее чем за секунду. Проблема возникает, когда источник медиа-элемента установлен и он читает файл до конца - большие файлы занимают время, и это задержка. Открываю новый вопрос, основанный на этом.
Вам следует провести некоторую диагностику, чтобы определить, какие линии действительно стоят все это время, маловероятно, что количество времени будет равномерно распределено по всей функции.
Поместите эту строку (или строки) в фоновый поток (надеюсь, что эта строка не обязательно должна быть в потоке пользовательского интерфейса).