/// <summary> /// 初始化资源管理器的新实例。 /// </summary> public ResourceManager() { m_AssetInfos = null; m_ResourceInfos = null; m_ReadWriteResourceInfos = new SortedDictionary <ResourceName, ReadWriteResourceInfo>(new ResourceNameComparer()); m_CachedBytesForEncryptedString = new byte[byte.MaxValue]; m_ResourceIniter = null; m_VersionListProcessor = null; m_ResourceChecker = null; m_ResourceUpdater = null; m_ResourceLoader = new ResourceLoader(this); m_ResourceHelper = null; m_ReadOnlyPath = null; m_ReadWritePath = null; m_ResourceMode = ResourceMode.Unspecified; m_RefuseSetCurrentVariant = false; m_CurrentVariant = null; m_UpdatePrefixUri = null; m_ApplicableGameVersion = null; m_InternalResourceVersion = 0; m_UpdateFileCache = null; m_DecompressCache = null; m_DecryptResourceCallback = null; m_InitResourcesCompleteCallback = null; m_UpdateVersionListCallbacks = null; m_CheckResourcesCompleteCallback = null; m_UpdateResourcesCompleteCallback = null; m_ResourceUpdateStartEventHandler = null; m_ResourceUpdateChangedEventHandler = null; m_ResourceUpdateSuccessEventHandler = null; m_ResourceUpdateFailureEventHandler = null; }
private void OnCheckerResourceCheckComplete(int removedCount, int updateCount, int updateTotalLength, int updateTotalZipLength) { m_VersionListProcessor.VersionListUpdateSuccess -= OnVersionListProcessorUpdateSuccess; m_VersionListProcessor.VersionListUpdateFailure -= OnVersionListProcessorUpdateFailure; m_VersionListProcessor.Shutdown(); m_VersionListProcessor = null; m_ResourceChecker.ResourceNeedUpdate -= OnCheckerResourceNeedUpdate; m_ResourceChecker.ResourceCheckComplete -= OnCheckerResourceCheckComplete; m_ResourceChecker.Shutdown(); m_ResourceChecker = null; m_ResourceUpdater.CheckResourceComplete(removedCount > 0); if (updateCount <= 0) { m_ResourceUpdater.ResourceUpdateStart -= OnUpdaterResourceUpdateStart; m_ResourceUpdater.ResourceUpdateChanged -= OnUpdaterResourceUpdateChanged; m_ResourceUpdater.ResourceUpdateSuccess -= OnUpdaterResourceUpdateSuccess; m_ResourceUpdater.ResourceUpdateFailure -= OnUpdaterResourceUpdateFailure; m_ResourceUpdater.ResourceUpdateAllComplete -= OnUpdaterResourceUpdateAllComplete; m_ResourceUpdater.Shutdown(); m_ResourceUpdater = null; } if (m_ResourceCheckCompleteEventHandler != null) { m_ResourceCheckCompleteEventHandler(this, new ResourceCheckCompleteEventArgs(removedCount, updateCount, updateTotalLength, updateTotalZipLength)); } }
/// <summary> /// 初始化资源管理器的新实例。 /// </summary> public ResourceManager() { m_AssetInfos = new Dictionary <string, AssetInfo>(); m_AssetDependencyInfos = new Dictionary <string, AssetDependencyInfo>(); m_ResourceInfos = new Dictionary <ResourceName, ResourceInfo>(); m_ResourceGroups = new Dictionary <string, ResourceGroup>(); m_ReadWriteResourceInfos = new SortedDictionary <ResourceName, ReadWriteResourceInfo>(new ResourceNameComparer()); m_ResourceIniter = null; m_VersionListProcessor = null; m_ResourceChecker = null; m_ResourceUpdater = null; m_ResourceLoader = new ResourceLoader(this); m_ResourceHelper = null; m_ReadOnlyPath = null; m_ReadWritePath = null; m_ResourceMode = ResourceMode.Unspecified; m_RefuseSetCurrentVariant = false; m_CurrentVariant = null; m_UpdatePrefixUri = null; m_ApplicableGameVersion = null; m_InternalResourceVersion = 0; m_DecryptResourceCallback = null; m_ResourceInitCompleteEventHandler = null; m_VersionListUpdateSuccessEventHandler = null; m_VersionListUpdateFailureEventHandler = null; m_ResourceCheckCompleteEventHandler = null; m_ResourceUpdateStartEventHandler = null; m_ResourceUpdateChangedEventHandler = null; m_ResourceUpdateSuccessEventHandler = null; m_ResourceUpdateFailureEventHandler = null; m_ResourceUpdateAllCompleteEventHandler = null; }
private void OnCheckerResourceCheckComplete(int removedCount, int updateCount, long updateTotalLength, long updateTotalZipLength) { m_VersionListProcessor.VersionListUpdateSuccess -= OnVersionListProcessorUpdateSuccess; m_VersionListProcessor.VersionListUpdateFailure -= OnVersionListProcessorUpdateFailure; m_VersionListProcessor.Shutdown(); m_VersionListProcessor = null; m_UpdateVersionListCallbacks = null; m_ResourceChecker.ResourceNeedUpdate -= OnCheckerResourceNeedUpdate; m_ResourceChecker.ResourceCheckComplete -= OnCheckerResourceCheckComplete; m_ResourceChecker.Shutdown(); m_ResourceChecker = null; m_ResourceUpdater.CheckResourceComplete(removedCount > 0); if (updateCount <= 0) { m_ResourceUpdater.ResourceUpdateStart -= OnUpdaterResourceUpdateStart; m_ResourceUpdater.ResourceUpdateChanged -= OnUpdaterResourceUpdateChanged; m_ResourceUpdater.ResourceUpdateSuccess -= OnUpdaterResourceUpdateSuccess; m_ResourceUpdater.ResourceUpdateFailure -= OnUpdaterResourceUpdateFailure; m_ResourceUpdater.ResourceUpdateAllComplete -= OnUpdaterResourceUpdateAllComplete; m_ResourceUpdater.Shutdown(); m_ResourceUpdater = null; m_UpdateFileCache = null; if (m_DecompressCache != null) { m_DecompressCache.Dispose(); m_DecompressCache = null; } } m_CheckResourcesCompleteCallback(updateCount > 0, removedCount, updateCount, updateTotalLength, updateTotalZipLength); m_CheckResourcesCompleteCallback = null; }
private void OnDownloadSuccess(object sender, DownloadSuccessEventArgs e) { VersionListProcessor versionListProcessor = e.UserData as VersionListProcessor; byte[] bytes = File.ReadAllBytes(e.DownloadPath); if (m_VersionListZipLength != bytes.Length) { } int hashCode = Utility.Converter.GetInt32(Utility.Verifier.GetCrc32(bytes)); if (m_VersionListZipLength != hashCode) { } try { bytes = Utility.Zip.Decompress(bytes); } catch (Exception e) { } if (bytes == null) { } if (m_VersionListLength != bytes.Length) { } File.WriteAllBytes(e.DownloadPath, bytes); VersionListUpdateSuccess(e.DownloadPath, e.DownloadUri); }
public void SetResourceMode(ResourceMode mode) { if (m_ResourceMode == m_ResourceMode.Unspecified) { m_ResourceMode = m_ResourceMode; if (m_ResourceMode == ResourceMode.Package) { m_ResourceIniter = new ResourceIniter(this); m_ResourceIniter.ResourceInitComplete += OnInitResourceInitComplete; } else if (m_ResourceMode == ResourceMode.Updatable) { m_VersionListProcessor = new VersionListProcessor(this); m_VersionListProcessor.VersionListUpdateSuccess += OnVersionListProcessorUpdateSuccess; m_ResourceChecker = new ResourceChecker(this); m_ResourceChecker.ResourceNeedUpdate += OnCheckerResourceNeedUpdate; m_ResourceChecker.ResourceCheckComplete += OnCheckResourceCheckComplete; m_ResourceUpdater = new ResourceUpdater(this); m_ResourceUpdater.ResourceUpdateStart += OnUpdateResourceUpdateStart; m_ResourceUpdater.ResourceUpdateSuccess += OnUpdateResourceUpdateSuccess; } } }
internal override void Shutdown() { if (m_ResourceIniter != null) { m_ResourceIniter.Shutdown(); m_ResourceIniter = null; } m_VersionListProcessor.VersionListUpdateSuccess -= OnVersionListProcessorUpdateSuccess; m_VersionListProcessor.Shutdown(); m_VersionListProcessor = null; m_ResourceChecker.ResourceNeedUpdate -= OnCheckerResourceNeedUpdate; m_resourceChecker.Shutdown(); m_ResourceChecker = null; m_ResourceUpdater.ResourceUpdateStart -= OnUpdateResourceUpdateStart; m_ResourceUpdater.ResourceUpdateAllComplete -= OnUpdateResourceUpdateAllComplete; m_ResourceUpdater.Shutdown(); m_ResourceUpdater = null; m_ResourceLoader.Shutdown(); m_ResourceLoader = null; m_AssetInfos.Clear(); m_AssetDependencyInfos.Clear(); m_ResourceInfos.Clear(); m_ReadWriteResourceInfos.Clear(); }
private void OnDownloadSuccess(object sender, DownloadSuccessEventArgs e) { VersionListProcessor versionListProcessor = e.UserData as VersionListProcessor; if (versionListProcessor == null || versionListProcessor != this) { return; } byte[] bytes = File.ReadAllBytes(e.DownloadPath); if (m_VersionListZipLength != bytes.Length) { string errorMessage = string.Format("Latest version list zip length error, need '{0}', downloaded '{1}'.", m_VersionListZipLength.ToString(), bytes.Length.ToString()); OnDownloadFailure(this, new DownloadFailureEventArgs(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData)); return; } int hashCode = Utility.Converter.GetInt32(Utility.Verifier.GetCrc32(bytes)); if (m_VersionListZipHashCode != hashCode) { string errorMessage = string.Format("Latest version list zip hash code error, need '{0}', downloaded '{1}'.", m_VersionListZipHashCode.ToString("X8"), hashCode.ToString("X8")); OnDownloadFailure(this, new DownloadFailureEventArgs(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData)); return; } try { bytes = Utility.Zip.Decompress(bytes); } catch (Exception exception) { string errorMessage = string.Format("Unable to decompress latest version list '{0}' with error message '{1}'.", e.DownloadPath, exception.Message); OnDownloadFailure(this, new DownloadFailureEventArgs(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData)); return; } if (bytes == null) { string errorMessage = string.Format("Unable to decompress latest version list '{0}'.", e.DownloadPath); OnDownloadFailure(this, new DownloadFailureEventArgs(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData)); return; } if (m_VersionListLength != bytes.Length) { string errorMessage = string.Format("Latest version list length error, need '{0}', downloaded '{1}'.", m_VersionListLength.ToString(), bytes.Length.ToString()); OnDownloadFailure(this, new DownloadFailureEventArgs(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData)); return; } File.WriteAllBytes(e.DownloadPath, bytes); if (VersionListUpdateSuccess != null) { VersionListUpdateSuccess(e.DownloadPath, e.DownloadUri); } }
private void OnDownloadFailure(object sender, DownloadFailureEventArgs e) { VersionListProcessor versionListProcessor = e.UserData as VersionListProcessor; if (versionListProcessor == null || versionListProcessor != this) { return; } if (File.Exists(e.DownloadPath)) { File.Delete(e.DownloadPath); } VersionListUpdateFailure?.Invoke(e.DownloadUri, e.ErrorMessage); }
/// <summary> /// 设置资源模式。 /// </summary> /// <param name="resourceMode">资源模式。</param> public void SetResourceMode(ResourceMode resourceMode) { if (resourceMode == ResourceMode.Unspecified) { throw new AshException("Resource mode is invalid."); } if (m_ResourceMode == ResourceMode.Unspecified) { m_ResourceMode = resourceMode; if (m_ResourceMode == ResourceMode.Package) { m_ResourceIniter = new ResourceIniter(this); m_ResourceIniter.ResourceInitComplete += OnIniterResourceInitComplete; } else if (m_ResourceMode == ResourceMode.Updatable) { m_VersionListProcessor = new VersionListProcessor(this); m_VersionListProcessor.VersionListUpdateSuccess += OnVersionListProcessorUpdateSuccess; m_VersionListProcessor.VersionListUpdateFailure += OnVersionListProcessorUpdateFailure; m_ResourceChecker = new ResourceChecker(this); m_ResourceChecker.ResourceNeedUpdate += OnCheckerResourceNeedUpdate; m_ResourceChecker.ResourceCheckComplete += OnCheckerResourceCheckComplete; m_ResourceUpdater = new ResourceUpdater(this); m_ResourceUpdater.ResourceUpdateStart += OnUpdaterResourceUpdateStart; m_ResourceUpdater.ResourceUpdateChanged += OnUpdaterResourceUpdateChanged; m_ResourceUpdater.ResourceUpdateSuccess += OnUpdaterResourceUpdateSuccess; m_ResourceUpdater.ResourceUpdateFailure += OnUpdaterResourceUpdateFailure; m_ResourceUpdater.ResourceUpdateAllComplete += OnUpdaterResourceUpdateAllComplete; } } else if (m_ResourceMode != resourceMode) { throw new AshException("You can not change resource mode at this time."); } }
private void OnCheckerResourceCheckComplete(int removedCount, int updateCount) { m_VersionListProcessor.VersionListUpdateSuccess -= OnVersionListProcessorUpdateSuccess; m_VersionListProcessor.Shutdown(); m_VersionListProcessor = null; m_ResourceChecker.ResourceNeedComplete -= OnCheckerResourceNeedUpdate; m_ResourceChecker.ResourceCheckComplete -= OnCheckerResourceCheckComplete; m_ResourceChecker.Shutdown(); m_ResourceChecker = null; m_ResourceUpdater.CheckResourceComplete(removedCount > 0); if (updateCount < 0) { m_ResourceUpdater.ResourceUpdateAllComplete -= OnUpdateResourceUpdateAllComplete; m_ResourceUpdater.Shutdown(); m_ResourceUpdater = null; } m_ResourceCheckCompleteEventHandler(this, new ResourceCheckCompleteEventArgs(removedCount, updateCount)); }
private void OnDownloadSuccess(object sender, DownloadSuccessEventArgs e) { VersionListProcessor versionListProcessor = e.UserData as VersionListProcessor; if (versionListProcessor == null || versionListProcessor != this) { return; } using (FileStream fileStream = new FileStream(e.DownloadPath, FileMode.Open, FileAccess.ReadWrite)) { int length = (int)fileStream.Length; if (length != m_VersionListCompressedLength) { fileStream.Close(); string errorMessage = Utility.Text.Format("Latest version list compressed length error, need '{0}', downloaded '{1}'.", m_VersionListCompressedLength.ToString(), length.ToString()); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } fileStream.Position = 0L; int hashCode = Utility.Verifier.GetCrc32(fileStream); if (hashCode != m_VersionListCompressedHashCode) { fileStream.Close(); string errorMessage = Utility.Text.Format("Latest version list compressed hash code error, need '{0}', downloaded '{1}'.", m_VersionListCompressedHashCode.ToString(), hashCode.ToString()); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } if (m_ResourceManager.m_DecompressCachedStream == null) { m_ResourceManager.m_DecompressCachedStream = new MemoryStream(); } try { fileStream.Position = 0L; m_ResourceManager.m_DecompressCachedStream.Position = 0L; m_ResourceManager.m_DecompressCachedStream.SetLength(0L); if (!Utility.Compression.Decompress(fileStream, m_ResourceManager.m_DecompressCachedStream)) { fileStream.Close(); string errorMessage = Utility.Text.Format("Unable to decompress latest version list '{0}'.", e.DownloadPath); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } if (m_ResourceManager.m_DecompressCachedStream.Length != m_VersionListLength) { fileStream.Close(); string errorMessage = Utility.Text.Format("Latest version list length error, need '{0}', downloaded '{1}'.", m_VersionListLength.ToString(), m_ResourceManager.m_DecompressCachedStream.Length.ToString()); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } fileStream.Position = 0L; fileStream.SetLength(0L); fileStream.Write(m_ResourceManager.m_DecompressCachedStream.GetBuffer(), 0, (int)m_ResourceManager.m_DecompressCachedStream.Length); } catch (Exception exception) { fileStream.Close(); string errorMessage = Utility.Text.Format("Unable to decompress latest version list '{0}' with error message '{1}'.", e.DownloadPath, exception.ToString()); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } finally { m_ResourceManager.m_DecompressCachedStream.Position = 0L; m_ResourceManager.m_DecompressCachedStream.SetLength(0L); } } if (VersionListUpdateSuccess != null) { VersionListUpdateSuccess(e.DownloadPath, e.DownloadUri); } }
/// <summary> /// 关闭并清理资源管理器。 /// </summary> internal override void Shutdown() { if (m_ResourceIniter != null) { m_ResourceIniter.Shutdown(); m_ResourceIniter = null; } if (m_VersionListProcessor != null) { m_VersionListProcessor.VersionListUpdateSuccess -= OnVersionListProcessorUpdateSuccess; m_VersionListProcessor.VersionListUpdateFailure -= OnVersionListProcessorUpdateFailure; m_VersionListProcessor.Shutdown(); m_VersionListProcessor = null; } if (m_ResourceChecker != null) { m_ResourceChecker.ResourceNeedUpdate -= OnCheckerResourceNeedUpdate; m_ResourceChecker.ResourceCheckComplete -= OnCheckerResourceCheckComplete; m_ResourceChecker.Shutdown(); m_ResourceChecker = null; } if (m_ResourceUpdater != null) { m_ResourceUpdater.ResourceUpdateStart -= OnUpdaterResourceUpdateStart; m_ResourceUpdater.ResourceUpdateChanged -= OnUpdaterResourceUpdateChanged; m_ResourceUpdater.ResourceUpdateSuccess -= OnUpdaterResourceUpdateSuccess; m_ResourceUpdater.ResourceUpdateFailure -= OnUpdaterResourceUpdateFailure; m_ResourceUpdater.ResourceUpdateAllComplete -= OnUpdaterResourceUpdateAllComplete; m_ResourceUpdater.Shutdown(); m_ResourceUpdater = null; m_UpdateFileCache = null; if (m_DecompressCache != null) { m_DecompressCache.Dispose(); m_DecompressCache = null; } } if (m_ResourceLoader != null) { m_ResourceLoader.Shutdown(); m_ResourceLoader = null; } if (m_AssetInfos != null) { m_AssetInfos.Clear(); m_AssetInfos = null; } if (m_ResourceInfos != null) { m_ResourceInfos.Clear(); m_ResourceInfos = null; } m_ReadWriteResourceInfos.Clear(); }
private void OnDownloadSuccess(object sender, DownloadSuccessEventArgs e) { VersionListProcessor versionListProcessor = e.UserData as VersionListProcessor; if (versionListProcessor == null || versionListProcessor != this) { return; } using (FileStream fileStream = new FileStream(e.DownloadPath, FileMode.Open, FileAccess.ReadWrite)) { int length = (int)fileStream.Length; if (length != m_VersionListZipLength) { fileStream.Close(); string errorMessage = Utility.Text.Format("Latest version list zip length error, need '{0}', downloaded '{1}'.", m_VersionListZipLength.ToString(), length.ToString()); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } if (m_ResourceManager.UpdateFileCacheLength < length) { m_ResourceManager.UpdateFileCacheLength = (length / OneMegaBytes + 1) * OneMegaBytes; } int offset = 0; int count = length; while (count > 0) { int bytesRead = fileStream.Read(m_ResourceManager.m_UpdateFileCache, offset, count); if (bytesRead <= 0) { throw new GameFrameworkException(Utility.Text.Format("Unknown error when load file '{0}'.", e.DownloadPath)); } offset += bytesRead; count -= bytesRead; } int hashCode = Utility.Converter.GetInt32(Utility.Verifier.GetCrc32(m_ResourceManager.m_UpdateFileCache, 0, length)); if (hashCode != m_VersionListZipHashCode) { fileStream.Close(); string errorMessage = Utility.Text.Format("Latest version list zip hash code error, need '{0}', downloaded '{1}'.", m_VersionListZipHashCode.ToString("X8"), hashCode.ToString("X8")); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } try { if (m_ResourceManager.m_DecompressCache == null) { m_ResourceManager.m_DecompressCache = new MemoryStream(); } m_ResourceManager.m_DecompressCache.Position = 0L; m_ResourceManager.m_DecompressCache.SetLength(0L); if (!Utility.Zip.Decompress(m_ResourceManager.m_UpdateFileCache, 0, length, m_ResourceManager.m_DecompressCache)) { fileStream.Close(); string errorMessage = Utility.Text.Format("Unable to decompress latest version list '{0}'.", e.DownloadPath); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } if (m_ResourceManager.m_DecompressCache.Length != m_VersionListLength) { fileStream.Close(); string errorMessage = Utility.Text.Format("Latest version list length error, need '{0}', downloaded '{1}'.", m_VersionListLength.ToString(), m_ResourceManager.m_DecompressCache.Length.ToString()); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } fileStream.Position = 0L; fileStream.SetLength(0L); m_ResourceManager.m_DecompressCache.Position = 0L; int bytesRead = 0; while ((bytesRead = m_ResourceManager.m_DecompressCache.Read(m_ResourceManager.m_UpdateFileCache, 0, m_ResourceManager.m_UpdateFileCache.Length)) > 0) { fileStream.Write(m_ResourceManager.m_UpdateFileCache, 0, bytesRead); } } catch (Exception exception) { fileStream.Close(); string errorMessage = Utility.Text.Format("Unable to decompress latest version list '{0}' with error message '{1}'.", e.DownloadPath, exception.Message); DownloadFailureEventArgs downloadFailureEventArgs = DownloadFailureEventArgs.Create(e.SerialId, e.DownloadPath, e.DownloadUri, errorMessage, e.UserData); OnDownloadFailure(this, downloadFailureEventArgs); ReferencePool.Release(downloadFailureEventArgs); return; } } if (VersionListUpdateSuccess != null) { VersionListUpdateSuccess(e.DownloadPath, e.DownloadUri); } }