Фоновые задачи в WinRT
Эта ситуация:
Я получаю из разных мест в Интернете, JSON объектов.
Они содержат много геокординат, которые я положил на BingMap. Это прекрасно работает отлично.
Эта проблема:
но когда я получаю данные из интернета, я получаю блокирующий интерфейс. Есть ли способ запустить это в фоновом режиме?
Я попробовал асинхронную функциональность, но у меня там тоже блокирующий интерфейс..
Вот код звонящего
public async void Caller_Click(){
await jsonDataClass.DoOperations();
}
Метод в jsonDataClass
public async Task<bool> DoOperations(){
// do requests and some stuff..
var fetchedElements = getdata(); // not async, because its in a portable lib
foreach (var element in fetchedElements)
OnEvent(element); // raises an event to assing the element to the Bing map
}
1 ответ
Не игнорируйте предупреждения компилятора. В частности, если у вас есть async
метод, который не использует await
Затем компилятор специально сообщит вам, что метод не асинхронный и будет работать синхронно.
Первое, что я бы порекомендовал, это изменить getdata
так что это async
, Microsoft.Bcl.Async
Пакет NuGet расширяется async
поддержка переносимых библиотек классов.
Если это невозможно, вам придется выполнить getdata
в фоновом потоке, вот так:
public async Task<bool> DoOperations()
{
var fetchedElements = await Task.Run(() => getdata());
foreach (var element in fetchedElements)
OnEvent(element);
}
PS Термин "фоновая задача" имеет особое значение в WinRT. На самом деле вам нужно запустить код в потоке пула потоков (или в фоновом потоке), который отличается от того, что WinRT называет "фоновой задачей".