我希望能够运行另一个全局方法,该方法将在用户浏览页面时继续执行。
所以我在App.xaml
中完成了一项任务:
public static Task globalTask = null;
然后:
public App()
{
...
globalTask = Update();
}
和Update()
方法是这样的:
public async Task Update()
{
while (true)
{
if (DateTime.Now.Second % 5 == 0)
await db.InsertCurrentTime(DateTime.Now);
}
}
但是当我调试时,我发现Update()
没有连续工作。
问题是:如何在应用程序运行时让Update()
方法继续工作?无论如何,使用async
await
或以其他方式。
注意:这是我正在做的简化版本,删除了不必要的东西
答案 0 :(得分:2)
所以这里有几个问题。
首先,async
方法只允许在方法中使用await
。它不会自动使该方法在另一个线程中运行。调用此方法时,调用方将同步运行该方法,直到它到达await
,然后运行方法的其余部分作为等待任务的延续。由于您没有等待,并且您有一个无限循环,这意味着调用此方法只会导致调用者永远阻塞。
接下来,您的代码似乎旨在每5秒运行一次代码,但它不会这样做。相反,它在每五秒钟中的一次中运行给定的代码块尽可能多次。现在似乎操作是在数据库中插入一些东西,它可能每秒都能做几次。如果你有一个更快的操作,它可能能够在一秒钟内完成数百万次。那可能很糟糕。你不想这样做。
哦,它还有一个问题,即线程可能会在没有被安排的情况下整整一秒。人们希望它不会发生,因为计算机需要很长时间,但技术上可以跳过整个迭代。
另一个问题是你正在忙着等待。在5秒钟内,您的代码会尽可能快地在其while
循环中旋转,每次都跳过if
块。这浪费了大量的CPU时间,实现零利益。
因此,虽然您可以找到将其移动到另一个线程的方法,但您不希望这样做。相反,只需使用Timer
并将间隔设置为5秒即可可靠且高效地每5秒运行一些代码。
如果您想使用await
,那么您可以执行以下操作:
public async Task Update()
{
while (true)
{
db.InsertCurrentTime(DateTime.Now);
await Task.Delay(TimeSpan.FromSeconds(5))
.ConfigureAwait(false);//remove if you want the UI context
}
}
然后确保您每5秒运行一次代码块,并且您没有执行繁忙的等待5秒钟,而是使方法正确异步并使循环的每次迭代计划延续在5秒内运行。