我正在开发一款Windows Phone 8.1购物应用程序。在应用程序中,我有一个持续运行的线程,它会下载用户的购物篮并将其保存在本地缓存中以提高性能。
到目前为止,我的代码类似于以下内容:
while(UserLoggedIn)
{
await Networking.getBasket();
await Task.Delay(5000);
}
这个线程是在应用程序恢复时启动的。我的问题是:如何最好地控制这样一个线程?在应用程序恢复时,它似乎非常缓慢,有时会阻塞UI线程,尽管它完全是异步的。我该如何提高性能?
编辑
根据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);
Task.Delay
内部会使用定时器。 - Yuval Itzchakov