繁体   English   中英

Windows Phone:Task.Delay不起作用/应用程序挂在页面上

[英]Windows Phone: Task.Delay not working / Application hanging on a page

我正在为Windows Phone 8.1制作一个应用程序。 当用户导航到应用程序的特定页面时,将调用OnNavigatedTo()方法中的代码块。 看起来像这样:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    while (!hasUserWonGame)
    {
        Task.Delay(3000);
        //do stuff...
        Task.Delay(6000);
        //do more stuff...
        Task.Delay(2000);
        //do more stuff...
    }
}

调试时,单击按钮导航到该页面后,该应用程序仅挂在该页面上,甚至没有导航到该页面。 注释一下while阻止,该应用程序可以正常工作。 如果在块添加任何语句,它也可以正常工作。 但是,即使在使用Task.Delay ,在循环的最小部分中进行注释也使我(基本上)陷入了一个while (true)循环中。

问题是,用户甚至无法导航到页面,因此无法将hasUserWonGame更改为true。 为什么Task.Delay()不起作用,并让应用程序继续导航到页面?

没有一个好的,最小的,完整的代码示例 ,就不可能确定您真正想要的是什么。 但是可以肯定的是,您似乎误解了Task.Delay()功能,尽管缺乏细节,但也许我们可以猜测出一种修复代码的方法。

Task.Delay()方法,像任何异步方法,实际上并不执行工作,并等待返回,直到它完成。 相反,通过调用它来告诉您希望延迟发生的方法,并且该方法通过向您返回Task实例进行响应,您可以使用该Task实例确定何时实际完成该工作(即延迟)。

利用此功能的通常方法是使用await语句,并使用该语句必须具有async方法。 这实际上是很好的 ,因为如果我们使OnNavigatedTo()方法成为async方法,则它可以立即返回并让您的程序继续其需要做的事情,而不是锁定用户界面。

因此,例如,我们可以将方法更改为如下所示:

protected async override void OnNavigatedTo(NavigationEventArgs e)
{
    while (!hasUserWonGame)
    {
        await Task.Delay(3000);
        //do stuff...
        await Task.Delay(6000);
        //do more stuff...
        await Task.Delay(2000);
        //do more stuff...
    }
}

现在,这非常重要:在该方法也可以执行的任何“填充”中,您需要确保可以快速完成所有“填充”。 您不想使该方法花费大量时间来执行任何操作; 只是与UI相关的常规操作和少量计算。

如果该方法确实需要执行所有耗时的操作,以至于用户在运行该代码时会注意到UI被冻结,则需要(最好)将该代码分离为另一个方法,然后从一个方法中调用该方法。等待Task Task实例。 例如,类似await Task.Run(() => MyLengthyOperation());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM