private void loaded(LoadCompletedEventArgs e, LoadModuleCallback callback) { lock (e.Request.ModuleInfo) { (e.Request.ModuleInfo as ModuleInfo).Status = ModuleStatus.Loaded; } try { e.Request.ModuleInfo.Initialize(); } catch (Exception ex) { (e.Request.ModuleInfo as ModuleInfo).Raise(this, new LoadCompletedEventArgs(e.Request, null, ex, e.Cancelled, e.UserState)); if (callback != null) { callback(this, new LoadedMoudleEventArgs(e.Request, ex, false, LoadModuleStatus.End, e.UserState)); } else { throw new PageException(MessageResource.PageException_ModuleInitializeError_Ttitle, MessageResource.PageException_ModuleInitializeError_Message, ex, e.Request); } } (e.Request.ModuleInfo as ModuleInfo).Raise(this, e); if (callback != null) { callback(this, new LoadedMoudleEventArgs(e.Request, null, false, LoadModuleStatus.End, e.UserState)); } }
public void LoadModule(Request request, LoadModuleCallback callback) { if (request == null) { throw new ArgumentNullException("request"); } if (callback != null) { callback(this, new LoadedMoudleEventArgs(request, null, false, LoadModuleStatus.Begin, null)); } if (request.ModuleInfo.Status == ModuleStatus.Preloading) { XapModuleLoader loader = new XapModuleLoader(); loader.LoadCompleted += new EventHandler <LoadCompletedEventArgs>(OnLoadModule); loader.LoadProgress += new EventHandler <LoadProgressEventArgs>(OnLoadModuleProgress); loader.UserState = callback; loader.Load(request); lock (request.ModuleInfo) { (request.ModuleInfo as ModuleInfo).Status = ModuleStatus.Loading; } } else if (request.ModuleInfo.Status == ModuleStatus.Loading) { (request.ModuleInfo as ModuleInfo).RequestQueue.Enqueue(new KeyValuePair <Request, LoadModuleCallback>(request, callback)); } else if (request.ModuleInfo.Status == ModuleStatus.Loaded) { OnLoadModule(this, new LoadCompletedEventArgs(request, null, null, false, callback)); } else if (request.ModuleInfo.Status == ModuleStatus.Initialized) { (request.ModuleInfo as ModuleInfo).Raise(this, new LoadCompletedEventArgs(request, null, null, false, null)); if (callback != null) { callback(this, new LoadedMoudleEventArgs(request, null, false, LoadModuleStatus.End, null)); } } }
private void OnLoadModule(object sender, LoadCompletedEventArgs e) { LoadModuleCallback callback = e.UserState as LoadModuleCallback; if (e.Error != null) { ModuleInfo module = e.Request.ModuleInfo as ModuleInfo; lock (module) { module.Status = ModuleStatus.Preloading; } module.Raise(this, e); if (callback != null) { callback(this, new LoadedMoudleEventArgs(e.Request, e.Error, false, LoadModuleStatus.End, e.UserState)); } else { throw new PageException(MessageResource.PageException_PageLoadFailure_Title, MessageResource.PageException_PageLoadFailure_Message, e.Error, e.Request); } } /* * 如果发生页面初始化失败的时候,会导致再次打开这个页面的时候一直处于Loading状态 * 原因是EntryPointType可能在第一次加载的时候已经初始化,导致第二次不能进行加载; * (By Aaron.L.Zhou) */ if (e.Request.ModuleInfo.Status == ModuleStatus.Loading && e.Request.ModuleInfo.EntryPointType == null) { //是否所有的Xap Dll都已经加载完成; bool m_isLoaded = false; try { int loadedAssemblyCount = 0; Stream stream = e.Result; IEnumerable <AssemblyPart> parts = GetParts(stream, e.Request.ModuleInfo as ModuleInfo); ModuleInfo module = e.Request.ModuleInfo as ModuleInfo; string moduleFile = (module.m_entryPointType.Split(',')[1] + ".dll").ToLower(); module.m_stream = new StreamResourceInfo(stream, "xap"); LoadModuleConfig(module.m_stream, module.m_config); foreach (AssemblyPart item in parts) { LoadAssembly(stream, item, (a) => { Interlocked.Increment(ref loadedAssemblyCount); if (item.Source.ToLower() == moduleFile) { module.m_entryPointType = string.Format("{0},Version={1}", module.m_entryPointType, Regex.Match(a.FullName, @"Version=(?<version>[\d.]+)").Groups["version"].Value); } if (parts.Count() == loadedAssemblyCount) { m_isLoaded = true; loaded(e, callback); } }); } } catch (Exception ex) { ModuleInfo module = e.Request.ModuleInfo as ModuleInfo; if (!m_isLoaded) { lock (module) { module.Status = ModuleStatus.Preloading; } } module.Raise(this, new LoadCompletedEventArgs(e.Request, null, ex, e.Cancelled, e.UserState)); if (callback != null) { callback(this, new LoadedMoudleEventArgs(e.Request, ex, false, LoadModuleStatus.End, e.UserState)); } else { throw new PageException(MessageResource.PageException_ModuleInitializeError_Ttitle, MessageResource.PageException_ModuleInitializeError_Message, ex, e.Request); } } } }