private ManualResetEvent StartResolveReferencesWorker(string[] paths, Action <AssetDependencyInfo[]> setter, Progress progress) { var queue = new Queue <string>(paths); var dependencyInfoList = new List <AssetDependencyInfo>(); var resetEvent = new ManualResetEvent(false); var completedCount = 0; for (var i = 0; i < Environment.ProcessorCount; i++) { ThreadPool.QueueUserWorkItem(state => { var dependencyInfoListLocal = new List <AssetDependencyInfo>(); while (true) { string path = null; lock (queue) { if (queue.Any()) { path = queue.Dequeue(); } } if (path == null) { break; } var metadata = new AssetDependencyInfo(path, GetReferencingGuid(path)); dependencyInfoListLocal.Add(metadata); Interlocked.Increment(ref progress.Count); } lock (dependencyInfoList) { dependencyInfoList.AddRange(dependencyInfoListLocal); } // 全部終わった?. if (Interlocked.Increment(ref completedCount) == Environment.ProcessorCount) { setter(dependencyInfoList.ToArray()); resetEvent.Set(); } }); } return(resetEvent); }
/// <summary> /// 指定したアセットからこのアセットが参照されているかどうか返す. /// </summary> /// <param name="dependencyInfo"></param> /// <returns></returns> public bool IsReferencedFrom(AssetDependencyInfo dependencyInfo) { // fileIDがあるということはDLL. if (fileId != null) { // DLLの時はGUIDに加えてfileIDも比較. return(dependencyInfo.FileIdsByGuid.ContainsKey(guid) && dependencyInfo.FileIdsByGuid[guid].Contains(fileId)); } else { return(dependencyInfo.FileIdsByGuid.ContainsKey(guid)); } }
private AssetDependencyInfo?GetAssetDependencyInfo(string assetName) { if (string.IsNullOrEmpty(assetName)) { throw new AshException("Asset name is invalid."); } AssetDependencyInfo assetDependencyInfo = default(AssetDependencyInfo); if (m_AssetDependencyInfos.TryGetValue(assetName, out assetDependencyInfo)) { return(assetDependencyInfo); } return(null); }