在做WPF桌面项目的时候,经常会遇到需要等待几秒完成其他操作。

C#常用的方法有:
1.System.Threading.Thread.Sleep()

System.Threading.Thread.Sleep()

在指定的时间范围内,不会将线程计划为由操作系统执行。 此方法更改线程的状态以包括 WaitSleepJoin 。
可以指定 Timeout.Infinite 参数 millisecondsTimeout 以无限期挂起线程。 但是,我们建议你改为使用其他类(如 System.Threading Mutex 、、 或 ) Monitor EventWaitHandle Semaphore 来同步线程或管理资源。
系统时钟时钟时钟计时周期,以称为时钟分辨率的特定速率。 实际超时值可能不完全是指定的超时值,因为指定的超时值将调整为与时钟计时周期一致。 有关时钟分辨率和等待时间详细信息,请参阅系统 API 中的Sleep Windows函数。
此方法不执行标准 COM 和 SendMessage 抽取。

2.while循环

while (条件)
满足条件后结束循环

使用以上方法等待会造成程序的界面卡住一段时间无法操作,如果我们在WPF中使用对用户的体验非常的不友好,等待时间长用户可能认为你的程序已经卡死或者退出。那么就没有办法既能等待操作、程序还不会假死吗?

答案是“有” ,使用**Task.Delay(1000)**方法创建将在时间延迟后完成的任务。

Task.Delay(你需要等待的时间);

异步等待,如果你需要等待延时前面加上await就可以了。

await Task.Delay(你需要等待的时间);

在完成返回的任务前要等待的毫秒数;如果无限期等待,则为 -1

MSDN介绍关于Task.Delay

对于 IO 操作,尽量使用原生提供的 Async 方法(不要自己使用 Task.Run 调用一个同步的版本占用线程池资源); 对于没有 Async 版本的 IO 操作,如果可能耗时很长,则指定 CreateOptions 为 LongRunning。 其他短时间执行的任务才推荐使用 Task.Run。 将普通返回值转换成Task类型,这种事正确写法 return Task.FromResult(new SetMessage() { Id = request.Id, Data = request.
Thread.Sleep()是同步延迟,Task.Delay()是异步延迟。 Thread.Sleep()会阻塞线程,Task.Delay()不会。 Thread.Sleep()不能取消,Task.Delay()可以。 Task.Delay()实质创建一个运行给定时间的任务,Thread.Sleep()使当前线程休眠给定时间。 反编译Task.Delay(),基本上讲它就是个包裹在任务中的...
代码很简单,只是基本的应用, //基本创建方式,手动启动Task Task t1 = new Task(SleepFun); Console.WriteLine("t1 Status: {0}", t1.Status); t1.Start(); Console.WriteLine("t1 Status: {0}", t1.Status); t1.Wait(); //使用lambda表达式和 调用静态Run方法Task.Run使用默认值启动Tas
WPF 使用Task更新UI 有时候,我们需要操作比较耗时的操作,但又不想界面出现假死现象来等待我们的操作,我们可以使用一些遮罩层动画,在进行耗时的操作时,用一些加载动画来规避界面假死; Task task = new Task(() => //开启加载动画跨线程更新UI(myAnimation指遮罩层动画) this.Dispatcher.Invoke(() => {