每秒加载新图像
本文关键字:图像 新图像 加载 | 更新日期: 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动画
在更改控件的源代码后尝试刷新()控件