public override void InitializeAsync() { _asyncWorker = new BackgroundWorker { WorkerSupportsCancellation = true }; _asyncWorker.DoWork += delegate { if (!_isLoadingAsync && (MaterialAssets == null || MaterialAssets.Count == 0)) { _isLoadingAsync = true; IsBusy = true; var filename = SourceVoxelFilepath ?? VoxelFilepath; Dictionary <string, long> details; try { details = MyVoxelMap.GetMaterialAssetDetails(filename); } catch { IsBusy = false; _isLoadingAsync = false; return; } var sum = details.Values.ToList().Sum(); var list = new List <VoxelMaterialAssetModel>(); foreach (var kvp in details) { list.Add(new VoxelMaterialAssetModel { MaterialName = kvp.Key, Volume = (double)kvp.Value / 255, Percent = (double)kvp.Value / (double)sum }); } MaterialAssets = list; IsBusy = false; _isLoadingAsync = false; } }; _asyncWorker.RunWorkerAsync(); }