0

我将回过头来在 Windows Phone 7 应用程序中执行一些更新,其中之一包括在不阻塞 UI 的情况下让应用程序暂停一会儿。我不确定执行此操作的最佳方法。在 Windows Phone 8 中,我引用了如何在不阻塞 UI的情况下暂停

void newButton_Click(object sender, EventArgs e)
{
    if (Settings.EnableVibration.Value)  //boolean flag to tell whether to vibrate or not
    {
        VibrateController.Default.Start();
        Task.Delay(100);
    }
    ...
}

Task.Delay我在 Windows Phone 7 中没有找到。有什么建议或建议吗?

4

1 回答 1

0

这适用于 Windows 8,我猜它也适用于你。如果您在后台有一个不断运行的进程,使用任务,您可以这样做:

定义在后台运行的东西:

定义要暂停时要翻转的任务和布尔值

    Task doStuff;
    static bool pauseTask = false;

在需要的地方定义任务:

    doStuff = new Task(LoopForMe);
    doStuff.Start();

只是做某事的功能

    private async static void LoopForMe()
    {
        //Keep thread busy forever for the sake of the example
        int counter = 0;
        while (true)
        {
            //Define pauseTask as a static bool. You will flip this
            //when you want to pause the task
            if (pauseTask)
            {
                await Task.Delay(100000);
                pauseTask = false;

            }

            Debug.WriteLine("working... " + counter);

            counter++;
            //Do something forever
        }
    }

在您的事件中,您可以翻转布尔值:

    pauseTask = true;

但是,我必须指出其中的一些缺陷。我会找到一种方法来确定应该“暂停”后台运行代码的任务何时能够解锁后台线程。这个例子只是强制线程等待一段时间。我会根据应该“阻止”它的代码来回翻转布尔值。换句话说,根据需要阻塞和解除阻塞线程,而不是依赖计时器。这种方法应该让您的 UI 在任务(又名线程)中的工作在预设时间内不做任何工作时仍然工作。

这里有很多陷阱。没有计时器如何让线程等待?现在您将进入更复杂的线程等待逻辑。上面代码的好处是它处于循环中。如果不是,你怎么做?不幸的是,您提出的问题相当含糊,所以我真的不知道您到底想“暂停”什么。请使用上面的代码作为起点。

于 2013-10-26T00:38:04.177 回答