4

Я работаю над приложением Windows Phone 8.1 для покупок. У меня есть непрерывный поток в приложении, который загружает корзину пользователей и сохраняет его в локальном кеше, чтобы повысить производительность. Пока что у меня есть что-то вроде этого:Справочная информация в Windows Phone 8.1 приложение

while(UserLoggedIn) 
{ 
    await Networking.getBasket(); 
    await Task.Delay(5000); 
} 

Этот поток запускается, когда приложение возобновляется. Мой вопрос: какой лучший подход для контроля такой темы? При возобновлении приложения это кажется очень медленным, и иногда он блокирует поток пользовательского интерфейса, хотя он полностью асинхронный. Как повысить производительность?

EDIT

Согласно предложению Romasz, я использовал таймер, как это:

объявляя его:

Timer _getBasketTimer; 

его инициализации в конструкторе приложения:

_getBasketTimer = new Timer(getBasketCallback, null, 5000, Timeout.Infinite); 

Определение обратного вызова :

private async void getBasketCallback(Object state) 
{ 
    if (JSONCache.getSessionID() != "" && Networking.LoginInProgress == false) 
     await Networking.getBasket(); 

    //The Change method may be called when the Timer object is already Disposed (I debugged it, and the exception did occur sometimes) 
    try 
    { 
     _getBasketTimer.Change(5000, Timeout.Infinite); 
    } 
    catch(ObjectDisposedException) 
    { 

    } 
} 

Располагая его Приостанавливая событии приложения, так что тема не будет работать, когда приложение приостановлено:

_getBasketTimer.Dispose(); 

и запустить его, когда приложение возобновляет:

_getBasketTimer = new Timer(getBasketCallback, null, 5000, Timeout.Infinite); 
+1

Почему бы не использовать таймер с интервалом в 5 секунд и проверить его в корзине? – Romasz

+0

Я не знал, что могу сделать что-то вроде этого :) Но это звучит круто! – WPMed

+0

@Romasz 'Task.Delay' внутренне использует таймер. –

ответ

1

Если вы хотите запустить что-то в потоке через интервалы (также в потоке, отличном от UI), вы можете использовать System.Threading.Timer. Образец может выглядеть следующим образом:

System.Threading.Timer myTimer = new System.Threading.Timer(async (state) => { if (UserLoggedIn) await Task.Delay(1000); }, null, 0, 5 * 1000); 

Обратите внимание, что если вы хотите получить доступ к элементам пользовательского интерфейса от обратного звонка таймера, то вам придется использовать диспетчера.

Также не забывайте останавливать таймеры/отменять задачи после приостановки приложения и возобновлять их при возобновлении события, если это необходимо.

2

Сложно сказать, не видя больше кода, но вам, вероятно, нужно обернуть свою петлю в новую нить, чтобы получить ее от нити пользовательского интерфейса:

Task.Run(async() => 
      { 
       while(UserLoggedIn) 
       { 
        await Networking.getBasket(); 
        await Task.Delay(5000); 
       } 
      });