每秒加载新图像

本文关键字:图像 新图像 加载 | 更新日期: 2023-09-27 17:54:17

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

下面的代码不能工作:

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秒,然后出现了第二张图像。

我该怎么做呢?谢谢。

每秒加载新图像

使用定时器

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

使用计时器

调用线程sleep会阻塞UI线程。为您找到这个链接:

我假设您的代码驻留在一个函数中,该函数在主线程上执行。因此,在函数返回之前,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控件。这里有更多的内容:比较。net框架类库中的定时器类

看:从UI线程强制更新GUI

:使用c#制作Gif动画

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