如何在应用程序旁边运行另一个方法

时间:2013-12-18 21:55:52

标签: c# windows-phone-8 parallel-processing windows-phone windows-phone-7.1

我希望能够运行另一个全局方法,该方法将在用户浏览页面时继续执行。

所以我在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或以其他方式。

注意:这是我正在做的简化版本,删除了不必要的东西

1 个答案:

答案 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秒内运行。

相关问题