У меня есть два метода:Как подождать до конца и только потом продолжить?
private async Task<GeoCoordinate> CenterMapOnMyLocation()
{
Geolocator myGeolocator = new Geolocator();
Geoposition myGeoposition = await myGeolocator.GetGeopositionAsync();
Geocoordinate myGeocoordinate = myGeoposition.Coordinate;
GeoCoordinate myGeoCoordinate =
ConvertGeocoordinate(myGeocoordinate);
MapCenter = myGeoCoordinate;
if (MyLocation.Latitude == 0 && MyLocation.Longitude == 0)
{
MyLocation = MapCenter;
}
return myGeoCoordinate;
}
и
private void GetClosestLocations(GeoCoordinate myLocation)
{
var locations = new ObservableCollection<PushPinModel>
{
new PushPinModel
{
Location = new GeoCoordinate(51.569593, 10.103504),
LocationName = "1"
},
new PushPinModel
{
Location = new GeoCoordinate(-45.569593, 1.103504),
LocationName = "2"
},
new PushPinModel
{
Location = new GeoCoordinate(0, 0),
LocationName = "3"
}
};
foreach (var location in locations)
{
location.DistanceToMyLocation = HaversineDistance(myLocation, location.Location);
}
Treks = new ObservableCollection<PushPinModel>(locations.OrderBy(l => l.DistanceToMyLocation).Take(2).ToList());
}
и в конструкторе у меня есть что-то вроде этого:
public NearbyControlViewModel()
{
var test = CenterMapOnMyLocation();
GetClosestLocations(test);
}
Теперь моя проблема заключается в том, что, когда второй метод вызываемый в конструкторе, переменная «test» еще не инициализирована ... потому что она асинхронна. То, что я хочу сделать, - это подождать, пока он будет инициализирован, и после этого вызовите второй метод. Если я вызову свой второй метод из метода async, я получу исключения: InvalidOperationException - Collection находится в режиме, недоступном для записи. Значение «Treks» привязано к MapItemsControl. Поэтому я думаю, что проблема связана с потоками.
Взгляните на тему «безопасная резьба». Особенно посмотрите на тупики и условия гонки. – jAC
Скомпилирует ли ваш код? 'CenterMapOnMyLocation' возвращает' Task 'Но' GetClosestLocations' принимает 'GeoCoordinate' –
I4V
Да, он компилируется. –