Я пытаюсь использовать библиотеку GoogleAPI Roads для привязки к дороге.
Вызов асинхронный:
GoogleMaps.Roads.SnapToRoad.QueryAsync(request).GetAwaiter();
Но когда я запускаю код, я получаю сообщение об ошибке «Операция не поддерживается на этой платформе». Исходный код был:
var response = await GoogleMaps.Roads.SnapToRoad.QueryAsync(request).Result;
Но для этого потребовалось наличие пустоты, которая делает этот вызов асинхронным, так что это просто переносит проблему на более раннее место в стеке вызовов.
Я также не могу использовать OnCompleted, так как для этого сначала требуется вызвать GetAwaiter. Я не уверен, что я делаю здесь неправильно.
Устройство работает под управлением iOS 16.7.4, Xcode 15.2 и Visual Studio 17.8.6.
Обновлено: Обновлено с помощью функции асинхронной задачи.
Все еще получаю ту же ошибку:
var response = await GoogleMaps.Roads.SnapToRoad.QueryAsync(request);
Вот что я получил сейчас:
public static async Task<List<Position>> snapToRoad(List<Position> gpsPos)
{
List<Position> result = new List<Position>();
List<List<Position>> subLists = ListExtensions.ChunkBy<Position>(gpsPos, 100);
foreach (List<Position> gPos in subLists)
{
Coordinate[] requestPath = gPos
.Select(geo => new Coordinate((double)geo.Latitude, (double)geo.Longitude))
.ToArray();
SnapToRoadsRequest request = new SnapToRoadsRequest
{
Key = MAPS_KEY,
Path = requestPath
};
var response = await GoogleMaps.Roads.SnapToRoad.QueryAsync(request);
foreach (SnappedPoint sp in response.SnappedPoints)
{
result.Add(new Position(sp.Location.Latitude, sp.Location.Longitude));
}
}
return result;
}
Он вызывается новым потоком, который запускается событием нажатия кнопки:
async void btnSomething_Click(object sender, EventArgs e)
{
Thread trd = new Thread(async () =>
{
var snapped = await MapUtils.snapToRoad(rawCordList);
});
trd.IsBackground = true;
trd.Start();
}
Извините, но это не работает.
Для чего ветка? Попробуйте без него. Это выглядит очень неуместно. Многопоточность и асинхронное программирование — связанные, но разные концепции, которые обычно плохо сочетаются.
Раньше я использовал Xamarin, и мне нужно было запустить его в потоке, потому что вам не разрешено выполнять сетевые действия в потоке пользовательского интерфейса на Android. Мауи является новым проектом, но использует ту же базу. Я получаю ту же ошибку, когда удаляю тему.
Выполнение длительных операций в потоке пользовательского интерфейса может привести к ошибкам ANR в Android, но этого не должно происходить при правильно реализованном async/await. Некоторые API на самом деле должны работать в основном потоке/UI-потоке. Это может быть и здесь. Если операция не должна явно выполняться в потоке пользовательского интерфейса, вам вообще не нужно обрабатывать потоки с помощью асинхронного шаблона на основе задач (TAP). Если по какой-то причине вам нужно что-то, что действительно можно запустить в потоке пула потоков, вы можете сделать await Task.Run(async () => await MapUtils.snapToRoad(rawCordList));.
Хорошо, приятно знать. Но я все еще застрял в этом вопросе :(





Оказывается, проблема была в библиотеке. Он пытается установить прокси-сервер, который в настоящее время не поддерживается Maui на iOS.
ты должен просто сделать
var response = await GoogleMaps.Roads.SnapToRoad.QueryAsync(request);