“导致silverlight应用程序进入”的大型方法;“没有回应”;状态

“导致silverlight应用程序进入”的大型方法;“没有回应”;状态,silverlight,silverlight-4.0,Silverlight,Silverlight 4.0,我正在开发一个通过silverlight MediaElement对象播放视频的应用程序 我有一个大的方法,这是负责以下 在视频的本地文件路径上打开一个FileInfo项目,并剥离文件名以获取文件名的第一部分,我们将其用作许可证获取过程的一部分 设置MediaElement上的许可证收单机构 设置MediaElement的源属性 当调用此方法时,实际上会导致应用程序进入“notrepunding”状态几秒钟。我如何避免这种情况?我试着把这些都放在后台工作程序中,但我必须为几乎所有的调用调用UI线

我正在开发一个通过silverlight MediaElement对象播放视频的应用程序

我有一个大的方法,这是负责以下

  • 在视频的本地文件路径上打开一个FileInfo项目,并剥离文件名以获取文件名的第一部分,我们将其用作许可证获取过程的一部分
  • 设置MediaElement上的许可证收单机构
  • 设置MediaElement的源属性
  • 当调用此方法时,实际上会导致应用程序进入“notrepunding”状态几秒钟。我如何避免这种情况?我试着把这些都放在后台工作程序中,但我必须为几乎所有的调用调用UI线程,这没有帮助,它似乎实际上使事情变慢了

    我有一个忙碌的方框,显示当这一切发生时,但实际上在应用程序没有响应的那几秒钟停止报告进度。我理解为什么会发生这种情况——在主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线程上)。

    因此,上面发布的方法并不是延迟的原因-该代码在不到一秒钟的时间内执行。当媒体元素的源被设置并且它将文件读到底时,问题就出现了——大文件需要时间,这就是延迟。基于此,我提出了一个新问题