【问题标题】:Background thread in Windows Phone 8.1 appWindows Phone 8.1 应用程序中的后台线程
【发布时间】: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


【解决方案1】:

如果不看更多代码很难判断,但您可能需要将循环包装在一个新线程中以使其脱离 UI 线程:

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

【讨论】:

    【解决方案2】:

    如果你想在一个线程上间隔运行一个东西(也可以在 UI 之外的线程上),你可以使用System.Threading.Timer。示例可能如下所示:

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

    请注意,如果您想从计时器的回调中访问 UI 元素,则必须使用 Dispatcher

    此外,不要忘记在您的应用暂停后停止计时器/取消任务,并在恢复事件时恢复它们(如果仍需要)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 1970-01-01
      • 2014-09-07
      • 1970-01-01
      相关资源
      最近更新 更多