在c#中休眠/暂停一个功能

时间:2013-03-02 19:10:52

标签: c# windows-phone-7 windows-phone-8

我正在制作wp 7.x / 8的应用程序。

有一个像 -

这样的功能
public void draw()
{
    .............
    ImageBrush imgbrush = new ImageBrush();
    imgbrush.ImageSource = new BitmapImage(...);

    rect.Fill = imgbrush;  //rect is of type Rectangle that has been created 
                           //and added to the canvas
    ........
}

和另一个功能

private void clicked(object sender, RoutedEventArgs e)
{
    draw();
    ........
    if (flag)
    {
          Thread.sleep(5000);
          draw();
    }
}

但是当单击该按钮时,两个绘制操作的结果同时出现在屏幕上。

如何使第二次draw()操作的结果在延迟一段时间后出现?

或者屏幕上是否有缓冲区,直到缓冲区未填满,屏幕才会刷新?

在这种情况下,如何显式刷新或刷新屏幕或强制使用Rectangle的.fill()方法在屏幕上进行更改?

在这方面的任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分:1)

正如pantaloons所说,由于你所有的动作都在同一个线程(第一次抽奖,睡眠和第二次抽奖),因此UI本身永远不会有机会更新。但是,有一个稍微好一点的实现(尽管它遵循与上述建议相同的原理)。

通过使用计时器,您可以让它等待另一个线程,允许UI在第二次绘制之前从第一次绘制更新​​,如下所示:

private void clicked(object sender, RoutedEventArgs e)
{
    draw();
    ........
    if (flag)
    {
        var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) };

        timer.Tick += (sender, args) => { timer.Stop(); draw(); };

        timer.Start();
    }
}

在此解决方案中,所有调用都由DispatcherTimer处理(它将自动回调到UI线程)。此外,如果需要连续两次调用draw,计时器将继续打勾直到停止,因此扩展包含计数将非常简单。

答案 1 :(得分:0)

问题是你是通过休眠来阻止UI线程的,所以在该函数返回之前,永远不会抽取绘制消息,其中更改同步发生。一个hacky解决方案将类似于以下内容,但实际上您应该更改您的应用程序设计以使用async / await模式。

private void clicked(object sender, RoutedEventArgs e)
{
    draw();
    if (flag)
    {
        System.Threading.Tasks.Task.Run(() =>
        {
            System.Threading.Thread.Sleep(5000);
            Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                draw();
            });
        });
    }
}