61.异步编程1 C#例子 WPF例子

embedded/2025/2/4 9:21:04/

和普通的任务绑定不太相同的部分如下:

 public MainWindowViewModel(){FetchUserInfoCommand = new RelayCommand(async (param) => await FetchUserInfoAsync());}private async Task FetchUserInfoAsync(){// 模拟异步操作,比如网络请求await Task.Delay(2000); // 模拟网络延迟UserInfo = "用户信息:新员工,需要学会WPF的异步,并巩固之前的知识。";}
        public MainWindowViewModel(){FetchUserInfoCommand = new RelayCommand(param => FetchUserInfoAsync());}//private async Task FetchUserInfoAsync()private void FetchUserInfoAsync(){Thread.Sleep(1000);UserInfo = "用户信息:新员工,需要学会WPF的异步,并巩固之前的知识。";}

前者是异步,后者则是普通的绑定任务。在前台实现的功能完全相同。但是后者却会导致前台卡死。

后台代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data.Common;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using static System.Runtime.InteropServices.JavaScript.JSType;namespace 异步
{public class MainWindowViewModel : INotifyPropertyChanged{private string _userInfo;public string UserInfo{get { return _userInfo; }set{_userInfo = value;OnPropertyChanged(nameof(UserInfo));}}public ICommand FetchUserInfoCommand { get; }//public MainWindowViewModel()//{//    //FetchUserInfoCommand = new RelayCommand(async (param) => await FetchUserInfoAsync());//    FetchUserInfoCommand = new RelayCommand(param => FetchUserInfoAsync());//}private async Task FetchUserInfoAsync()//private void FetchUserInfoAsync()//{//    // 模拟异步操作,比如网络请求//    //await Task.Delay(2000); // 模拟网络延迟//    Thread.Sleep(1000);//    UserInfo = "用户信息:新员工,需要学会WPF的异步,并巩固之前的知识。";//}public MainWindowViewModel(){FetchUserInfoCommand = new RelayCommand(async (param) => await FetchUserInfoAsync());}private async Task FetchUserInfoAsync(){// 模拟异步操作,比如网络请求await Task.Delay(2000); // 模拟网络延迟UserInfo = "用户信息:新员工,需要学会WPF的异步,并巩固之前的知识。";}//固定public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}public class RelayCommand : ICommand{private readonly Action<object> _execute;public event EventHandler CanExecuteChanged;public RelayCommand(Action<object> execute) => _execute = execute;public bool CanExecute(object parameter) => true; // 总是可执行(简化)public void Execute(object parameter) => _execute(parameter);}
}
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace 异步
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();DataContext=new MainWindowViewModel();}}
}

前台:

<Window x:Class="异步.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:异步"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><StackPanel><Button Content="获取用户信息" Command="{Binding FetchUserInfoCommand}" Margin="10"/><TextBox Text="{Binding UserInfo, UpdateSourceTrigger=PropertyChanged}" Margin="10,20,10,10" TextWrapping="Wrap" Height="100"/></StackPanel></Grid>
</Window>


http://www.ppmy.cn/embedded/159424.html

相关文章

【14】WLC3504 HA配置实例

1.概述 本文档使用 Cisco WLC 3504 实现无线控制器的高可用性。这里所指的HA是指WLC设备box-to-box的冗余。换句话说,即1:1的设备冗余,其中一个 WLC 将处于Active活动状态,而第二个 WLC 将处于Standby-hot热待机状态,通过RP冗余端口持续监控活动 WLC 的运行状况。两个 WLC…

【硬件测试】基于FPGA的QPSK+帧同步系统开发与硬件片内测试,包含高斯信道,误码统计,可设置SNR

目录 1.算法仿真效果 2.算法涉及理论知识概要 2.1QPSK 2.2 帧同步 3.Verilog核心程序 4.开发板使用说明和如何移植不同的开发板 5.完整算法代码文件获得 1.算法仿真效果 本文是之前写的文章 《基于FPGA的QPSK帧同步系统verilog开发,包含testbench,高斯信道,误码统计,可…

从理论到实践:Linux 进程替换与 exec 系列函数

个人主页&#xff1a;chian-ocean 文章专栏-Linux 前言&#xff1a; 在Linux中&#xff0c;进程替换&#xff08;Process Substitution&#xff09;是一个非常强大的特性&#xff0c;它允许将一个进程的输出直接当作一个文件来处理。这种技术通常用于Shell脚本和命令行操作中…

Java:日期时间范围的处理

java判断时间是否在某个时间段内_java判断一个时间是否在某个时间段-CSDN博客 java时间处理--判断当前时间是否在一个时间区间内_java_xtz......-腾讯云开发者社区 //需求&#xff1a;你发布了一个二手商品信息&#xff0c;其他用户看到后给你商品留言&#xff0c;如果留言时…

微信登录模块封装

文章目录 1.资质申请2.combinations-wx-login-starter1.目录结构2.pom.xml 引入okhttp依赖3.WxLoginProperties.java 属性配置4.WxLoginUtil.java 后端通过 code 获取 access_token的工具类5.WxLoginAutoConfiguration.java 自动配置类6.spring.factories 激活自动配置类 3.com…

3 Spark SQL

Spark SQL 1. 数据分析方式2. SparkSQL 前世今生3. Hive 和 SparkSQL4. 数据分类和 SparkSQL 适用场景1) 结构化数据2) 半结构化数据3) 总结 5. Spark SQL 数据抽象1) DataFrame2) DataSet3) RDD、DataFrame、DataSet 的区别4) 总结 6. Spark SQL 应用1) 创建 DataFrame/DataSe…

Node 处理客户端不同的请求方法

一、使用 http 模块处理请求方法 1. 创建 HTTP 服务器 const http require("http");const server http.createServer((req, res) > {// 处理不同的请求方法switch (req.method) {case "GET":handleGetRequest(req, res);break;case "POST"…

【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂

目录 1. 常见运算函数 个人主页&#xff1a;Icomi 专栏地址&#xff1a;PyTorch入门 在深度学习蓬勃发展的当下&#xff0c;PyTorch 是不可或缺的工具。它作为强大的深度学习框架&#xff0c;为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…