Фоновые задачи в 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 называет "фоновой задачей".

Другие вопросы по тегам