【发布时间】:2015-06-05 14:42:19
【问题描述】:
我正在开发一个 Windows Phone 8.1 购物应用程序。我在应用程序中有一个持续运行的线程,它下载用户购物篮并将其保存在本地缓存中以提高性能。 到目前为止,我所拥有的是这样的:
while(UserLoggedIn)
{
await Networking.getBasket();
await Task.Delay(5000);
}
该线程在应用程序恢复时启动。我的问题是:控制这样一个线程的最佳方法是什么?在应用程序恢复时,它似乎真的很慢,有时它会阻塞 UI 线程,尽管它是完全异步的。如何提高性能?
编辑
根据 Romasz 的建议,我使用了这样的 Timer:
声明:
Timer _getBasketTimer;
在 App 的构造函数中初始化它:
_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)
{
}
}
在 App 的 Suspending 事件中处理,这样当 App 被挂起时 Thread 不会运行:
_getBasketTimer.Dispose();
并在应用恢复时启动它:
_getBasketTimer = new Timer(getBasketCallback, null, 5000, Timeout.Infinite);
【问题讨论】:
-
为什么不使用间隔为 5 秒的计时器并在其滴答事件中检查篮子?
-
我不知道我可以做这样的事情 :) 但听起来很酷!
-
@Romasz
Task.Delay内部将使用计时器。 -
@Romasz 是的。 This 会回答你的问题:)
-
@YuvalItzchakov 抱歉之前的评论,但我错过了您评论中 This 背后的链接。现在一切都清楚了。
标签: c# multithreading networking windows-runtime windows-phone-8.1