“导致silverlight应用程序进入”的大型方法;“没有回应”;状态
我正在开发一个通过silverlight MediaElement对象播放视频的应用程序 我有一个大的方法,这是负责以下“导致silverlight应用程序进入”的大型方法;“没有回应”;状态,silverlight,silverlight-4.0,Silverlight,Silverlight 4.0,我正在开发一个通过silverlight MediaElement对象播放视频的应用程序 我有一个大的方法,这是负责以下 在视频的本地文件路径上打开一个FileInfo项目,并剥离文件名以获取文件名的第一部分,我们将其用作许可证获取过程的一部分 设置MediaElement上的许可证收单机构 设置MediaElement的源属性 当调用此方法时,实际上会导致应用程序进入“notrepunding”状态几秒钟。我如何避免这种情况?我试着把这些都放在后台工作程序中,但我必须为几乎所有的调用调用UI线
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");
}
}
谢谢
编辑:
因此,事实证明,上面发布的方法并不是延迟的原因——代码在不到一秒钟的时间内执行。当媒体元素的源被设置并且它将文件读到底时,问题就出现了——大文件需要时间,这就是延迟。基于此,我提出了一个新问题。您应该进行一些诊断,以确定哪一行真正花费了所有时间,时间量不太可能均匀分布在整个函数中
将该行(或多行)放在后台线程中(希望该行不需要在UI线程上)。因此,上面发布的方法并不是延迟的原因-该代码在不到一秒钟的时间内执行。当媒体元素的源被设置并且它将文件读到底时,问题就出现了——大文件需要时间,这就是延迟。基于此,我提出了一个新问题