在做一个医院的计时器的时候,让播放开始声音后在开始倒计时,当中用到了让程序暂停的问题,所以就总结了一下
一:第一种方法
可以用一个简单的方法来实现暂停效果,就是直接在代码中插入Thread.Sleep(3000),但是这样你会感觉你的用户界面假死了,因为Thread.Sleep(3000)会使当前线程休眠,而你在窗口界面所在的线程中执行,界面也就没有响应了。
二:第二种方法
这个方法与第一种方法差不多,即Application.DoEvents()方法,但是不会使界面失去响应,给用户带来较好的用户体验,可是DoEvents也带来了效率上的问题,处理同样的一个事件调用了DoEvents后效率降低了好几倍,此方法可以让界面线程执行正在等待执行的一系列事件,然后再执行下面的语句,你可以封装这样一个方法来实现延迟执行代码效果:
public void 延迟(int 毫秒) { var t = DateTime.Now.AddMilliseconds(毫秒); while (DateTime.Now < t) Application.DoEvents(); }
使用时只需:
语句1……;
语句2……;
延迟(6000);
语句3……
这样就可以实现延迟。
*注:Application.DoEvents()方法是在Winfrom 当中的,但是在WPF里面是没有Application.DoEvents();方法的,所以要在WPF里面用这个方法就请看下面的代码实现。
1 public static class DispatcherHelper 2 { 3 [SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] 4 public static void DoEvents() 5 { 6 DispatcherFrame frame = new DispatcherFrame(); 7 Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Background, new DispatcherOperationCallback(ExitFrames), frame); 8 try { Dispatcher.PushFrame(frame); } 9 catch (InvalidOperationException) { } 10 } 11 private static object ExitFrames(object frame) 12 { 13 ((DispatcherFrame)frame).Continue = false; 14 return null; 15 } 16 }
在需要暂停的地方调用即可:DispatcherHelper.DoEvents();
如下面的示例:
1 //让它暂停3秒种 2 var t = DateTime.Now.AddMilliseconds(3000); 3 while (DateTime.Now < t) 4 DispatcherHelper.DoEvents();//这里就可以调用了