睡眠/暂停在C#中的函数(Sleep / pause a function in c#)

2019-10-17 18:09发布

我正在为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();
    }
}

但是,单击该按钮时,双方平局操作的结果同时出现在屏幕上。

如何使第二轮抽签()操作的结果一些延迟后出现?

或者是有什么样缓冲屏幕,直到缓冲区没有填充屏幕不会刷新?

在这种情况下,如何刷新或明确地刷新屏幕或强制矩形的.fill伪()方法,使屏幕上的变化?

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

Answer 1:

至于裤子说,因为你的所有行动都是在同一个线程(第一次抽签,睡眠,第二个平局)上,用户界面本身从来没有得到一个机会来更新。 然而,有一个稍微好一点的实现(虽然它遵循相同的本金上述建议)。

通过使用定时器,可以让踢它等待另一个线程,允许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线程)来处理。 另外,如果平局需要调用比连续两次以上,定时器将继续滴答,直到停止,所以这将是非常简单的扩展到包括计数。



Answer 2:

问题是,你是睡阻塞UI线程,所以平局的消息从来没有抽,直到该函数返回,这里的变化同步发生。 哈克的解决办法是像下面这样,虽然你真的应该改变你的应用程序设计使用异步/等待模式。

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();
            });
        });
    }
}


文章来源: Sleep / pause a function in c#