async Task SetMapStationPins(Station[] stations, float alpha = 1) { var stationsToUpdate = stations.Where(station => { Marker marker; var stats = station.BikeCount + "|" + station.EmptySlotCount; if (existingMarkers.TryGetValue(station.Id, out marker)) { if (marker.Snippet == stats && !showedStale) { return(false); } marker.Remove(); } return(true); }).ToArray(); var pins = await Task.Run(() => stationsToUpdate.ToDictionary(station => station.Id, station => { var w = 24.ToPixels (); var h = 40.ToPixels (); if (station.Locked) { return(pinFactory.GetClosedPin(w, h)); } else if (!station.Installed) { return(pinFactory.GetNonInstalledPin(w, h)); } var ratio = (float)TruncateDigit(station.BikeCount / ((float)station.Capacity), 2); return(pinFactory.GetPin(ratio, station.BikeCount, w, h, alpha: alpha)); })); foreach (var station in stationsToUpdate) { var pin = pins [station.Id]; var snippet = station.BikeCount + "|" + station.EmptySlotCount; if (station.Locked) { snippet = string.Empty; } else if (!station.Installed) { snippet = "not_installed"; } var markerOptions = new MarkerOptions() .SetTitle(station.Id + "|" + station.Street + "|" + station.Name) .SetSnippet(snippet) .SetPosition(new Android.Gms.Maps.Model.LatLng(station.Location.Lat, station.Location.Lon)) .InvokeIcon(BitmapDescriptorFactory.FromBitmap(pin)); existingMarkers [station.Id] = mapFragment.Map.AddMarker(markerOptions); } }