private void OnDownloadModuleCompleted(object sender, OpenReadCompletedEventArgs e)
{
var moduleInfo = (ModuleInfo) e.UserState;
Log.Info("Downloaded module '{0}' from '{1}'", moduleInfo.ModuleName, GetModuleUri(moduleInfo));
var webClient = (WebClient) sender;
webClient.OpenReadCompleted -= OnDownloadModuleCompleted;
if (e.Error != null)
{
Log.Error(e.Error, "An error occurred while downloading module '{0}', cannot handle completed callbacks", moduleInfo.ModuleName);
return;
}
try
{
var moduleAsBytes = e.Result;
Log.Debug("Received '{0}' kb, now registering the xap file", moduleAsBytes.Length / 1000);
AssemblyHelper.RegisterAssembliesFromXap(e.Result, true);
Log.Info("Instantiating module '{0}'", moduleInfo.ModuleName);
var moduleType = TypeCache.GetType(moduleInfo.ModuleType);
var module = TypeFactory.Default.CreateInstance(moduleType) as ModuleBase;
Log.Info("Initializing module '{0}'", moduleInfo.ModuleName);
module.Initialize();
}
catch (Exception ex)
{
Log.Error(ex, "An error occurred while instantiating or initializing module '{0}'", moduleInfo.ModuleName);
}
finally
{
var pendingQueue = _pendingLoads[moduleInfo.ModuleName];
Log.Debug("Calling all '{0}' completed callbacks for module '{1}'", pendingQueue.Count, moduleInfo.ModuleName);
while (pendingQueue.Count > 0)
{
var completedCallback = pendingQueue.Dequeue();
completedCallback();
}
Log.Debug("Called all completed callbacks for module '{0}'", moduleInfo.ModuleName);
_pendingLoads.Remove(moduleInfo.ModuleName);
ModuleDownloaded.SafeInvoke(this, new ModuleEventArgs(moduleInfo));
}
}
#endregion