每秒加载新图像

时间:2011-05-03 11:59:56

标签: c# .net wpf multithreading image

我需要加载每秒(或两个)新图像。

以下代码不起作用:

System.Threading.Thread.Sleep(2000);
this.Image_LoadImage.Source = new BitmapImage(new Uri(@"D:\\connect2-1.gif"));
System.Threading.Thread.Sleep(2000);
this.Image_LoadImage.Source = new BitmapImage(new Uri(@"D:\\connect3-1.gif"));

我看到的是应用程序睡眠4秒钟,然后出现第二张图像。

我该怎么办? 感谢。

4 个答案:

答案 0 :(得分:5)

使用计时器。

调用线程休眠会阻止UI线程。找到了这个link

答案 1 :(得分:5)

使用计时器

    private System.Threading.Timer timer;
    public MainWindow()
    {
        InitializeComponent();
        timer = new System.Threading.Timer(OnTimerEllapsed, new object(), 0, 2000);
    }

    private void OnTimerEllapsed(object state)
    {
        if (!this.Dispatcher.CheckAccess())
        {
            this.Dispatcher.Invoke(new Action(LoadImages));
        }
    }

    private bool switcher;
    private void LoadImages()
    {
        string stringUri = switcher ? @"D:\\connect2-1.gif" :
                                      @"D:\\connect3-1.gif";
        this.Image_LoadImage.Source = new BitmapImage(new Uri(stringUri));

        switcher = !switcher;
    }

答案 2 :(得分:3)

我认为您的代码驻留在一个函数中,该函数在主线程上执行。因此,在函数返回之前,UI不会更新。

此时,在你的函数返回时,你将被留下最新的任何状态(这就是为什么你只看到你设置的最后一张图片的原因)。

另外,请注意,通过在函数中发出Sleep()请求,您实际上是在阻止应用程序的主线程(或者您的函数运行的任何线程,但很可能这是您的主线程)。在休眠期间,您的应用程序不会简单地响应任何内容,您的UI将会冻结。

您可能决定使控件无效(Control.Refresh()Control.Invalidate()Control.Update()Control.Refresh()Application.DoEvents()),但除非正确使用,否则这些通常都是黑客攻击。

使用Timer是一种选择。虽然,在您的具体情况下,简单地使用动画GIF可能是最好的解决方案。

请注意,如果您决定使用计时器System.Windows.Forms.Timer与其他计时器之间存在相当大的差异System.Windows.Forms.Timer将尽快在您的主线程上运行(因此,与UI控件交互将是安全的,因为您将从同一个线程执行此操作;但另一方面,它可能会触发稍有延迟)。相反,如果您要使用其他计时器,则无法在不违反重要规则的情况下直接访问UI控件。更多相关信息:Comparing the Timer Classes in the .NET Framework Class Library

请参阅: Force GUI update from UI Thread

和: Animated Gif in form using C#

答案 3 :(得分:0)

更改源代码后尝试刷新()控件。