我有一个 Windows 8 应用程序,并希望每 15 秒查询一次资源以获取状态更改(进入 web 服务 url),结果应写入绑定到 UI (XAML) 的 ViewModel 属性。
如果我们离开页面,任务应该终止。
我已经查看了后台任务,但对于这个特定于页面的任务来说,它们似乎有点过头了。
还玩过 Task.Run() 和 Dispatcher,但我无法让它与 while 循环一起工作。
有任何想法吗?
我有一个 Windows 8 应用程序,并希望每 15 秒查询一次资源以获取状态更改(进入 web 服务 url),结果应写入绑定到 UI (XAML) 的 ViewModel 属性。
如果我们离开页面,任务应该终止。
我已经查看了后台任务,但对于这个特定于页面的任务来说,它们似乎有点过头了。
还玩过 Task.Run() 和 Dispatcher,但我无法让它与 while 循环一起工作。
有任何想法吗?
如果您想每 x 秒执行一次操作,那么您应该使用计时器。由于您想在 WinRT UI 线程上运行它,因此正确的是Windows.UI.Xaml.DispatcherTimer
.
当您离开页面时,您应该Stop()
设置计时器,以便Tick
停止引发其事件。
如果你想await
在事件处理程序中做一些事情,你需要做它async
,例如:
timer.Tick += async (s, e) =>
{
var client = new HttpClient();
var response = await client.GetAsync(…);
…
}
这将创建一个async void
方法。请注意,您几乎不应该这样做,除非您正在编写事件处理程序。
您需要使用 UI 线程的Dispatcher。您可以将其保存到静态成员中以从任何地方获取它,或者您可以直接从活动 UI 中即时获取它。但是在您拥有Dispatcher之后,您可以调用(并等待)RunAsync方法。
await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(
new CoreDispatcherPriority(), action);
作为操作,您可以使用例如 lambda 表达式或您想要的任何其他预定义操作。在此操作中,您可以操作 UI 绑定元素。我希望它可以帮助你。