public override void Initialize() { // load all models lock (_syncRoot) { if (_initialized) { return; } foreach (var voxelModel in VoxelModelStorage.Enumerate()) { var vmodel = new VisualVoxelModel(voxelModel, VoxelMeshFactory); vmodel.BuildMesh(); //Build the mesh of all local models _models.Add(voxelModel.Name, vmodel); } _initialized = true; } // if we have some requested models, remove those that was loaded List <string> loadedModels; lock (_syncRoot) { loadedModels = _pendingModels.Where(Contains).ToList(); loadedModels.ForEach(m => _pendingModels.Remove(m)); } // fire events foreach (var loadedModel in loadedModels) { var model = GetModel(loadedModel, false); OnVoxelModelAvailable(new VoxelModelReceivedEventArgs { Model = model.VoxelModel }); } HashSet <string> requestSet; lock (_syncRoot) { _pendingModels.ExceptWith(loadedModels); requestSet = _pendingModels; _pendingModels = new HashSet <string>(); } // request the rest models foreach (var absentModel in requestSet) { RequestModelAsync(absentModel); } }