WPF 优雅等待、延时Task

1 篇文章 0 订阅
1 篇文章 0 订阅

在做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

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
WPF MVVM 中实现等待的功能可以通过以下步骤完成: 1. 创建一个布尔类型的属性,用于表示等待状态,例如 `IsWaiting`。 2. 在视图模型中,当需要进行等待操作时,将 `IsWaiting` 属性设置为 `true`。 3. 在视图中,可以使用一个遮罩层或者进度条等控件来展示等待的效果。可以使用一个绑定来将 `IsWaiting` 属性与控件的可见性或者动画效果进行绑定。 4. 等待完成后,将 `IsWaiting` 属性设置为 `false`,隐藏等待的控件。 下面是一个简单的示例代码: ```csharp // 在视图模型中定义 IsWaiting 属性 public class MainViewModel : INotifyPropertyChanged { private bool isWaiting; public bool IsWaiting { get { return isWaiting; } set { isWaiting = value; OnPropertyChanged(nameof(IsWaiting)); } } // 假设有一个需要进行等待的方法 public async Task WaitForSomethingAsync() { IsWaiting = true; // 执行等待操作 IsWaiting = false; } // INotifyPropertyChanged 接口实现代码... } ``` ```xaml <!-- 在视图中使用遮罩层来展示等待的效果 --> <Grid> <!-- 其他界面内容... --> <!-- 遮罩层 --> <Border Background="Gray" Opacity="0.5" Visibility="{Binding IsWaiting, Converter={StaticResource BoolToVisibilityConverter}}"> <TextBlock Text="Waiting..." HorizontalAlignment="Center" VerticalAlignment="Center"/> </Border> </Grid> ``` 在上述代码中,`MainViewModel` 类中的 `IsWaiting` 属性用于表示等待状态,当需要进行等待操作时,将其设置为 `true`,等待完成后设置为 `false`。在视图中,使用一个 `Border` 控件作为遮罩层来展示等待的效果,通过绑定 `IsWaiting` 属性与 `Visibility` 属性来控制遮罩层的显示与隐藏。 这样,在进行等待操作时,设置 `IsWaiting` 为 `true`,遮罩层将显示出来,表明正在等待等待完成后,设置 `IsWaiting` 为 `false`,遮罩层将隐藏起来,等待效果结束。 请注意,上述代码只是一个简单示例,实际应用中可能会有更复杂的等待操作和界面布局,你可以根据具体需求进行适配和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值