把 async 关键字用于 UWP 应用程序,需要注意,在 UI 线程中调用 await 之后,当异步方法返回时,将默认返回到 UI 线程中。这便于在异步方法完成后更新 UI 元素。

注意

为了创建 UWP 应用程序,需要 Windows 10,Windows 系统必须在 “开发人员模式” 下配置。启用 “开发人员模式” 时,需要打开 Windows 设置,选择 Update & Security 磁贴,选择 For developers 类别,并单击单选按钮 Developermode。这样系统就可以运行旁路的应用程序了(未从 Windows Store 中安装的应用程序),并为 “开发人员模式” 添加一个 Windows 包。

为了理解功能和问题,创建一个通用 Windows 应用程序。这个应用程序包含 5个 按钮和一个TextBlock元素,来演示不同的场景:

<StackPanel><Button Content="Start Async" Click="OnStartAsync" Margin="4" /><Button Content="Start Async with Config" Click="OnStartAsyncConfigureAwait"Margin="4" /><Button Content="start Async with thread switch"Click="OnStartAsyncWithThreadSwitch" Margin="4" /><Button Content="Use IAsyncOperation" Click="OnIAsyncOperation" Margin="4" /><Button Content="Deadlock" Click="OnStartDeadlock" Margin="4" /><TextBlock x:Name="text1" Margin="4" />
</StackPanel>

在 OnStartAsync 方法中,UI 线程的线程 ID 写入 TextBlock 元素。接下来调用异步方法 Task.Delay,它不阻塞 UI 线程,在此方法完成后,线程 ID 将再次写入TextBlock:

private async void OnstartAsync(object sender, RoutedEventArgs e)
{text1.Text = $"UI thread: {GetThread()}";await Task.Delay(1000);text1.Text += $"in after await: {GetThread()}";
}

为了访问线程 ID,可以使用 Environment 类。在 UWP 应用程序中,Thread 类是无效的 —— 至少在构建版本 15063 之前是这样的:

private string GetThread() => $"thread: {Environment.CurrentManagedThreadId)";

运行应用程序时,可以在文本元素中看到类似的输出。与控制台应用程序相反,UWP 应用程序定义了一个同步上下文,在等待之后,可以看到与以前相同的线程。这允许直接访问 UI 元素:

UI thread: thread 3
after await:thread 3

C# 异步与Windows应用程序相关推荐

  1. 第二章 WINDOWS应用程序框架

    创建窗口只需调用CreateWindow 函数即可,但实际上并不这么简单. 但实际上并非真得这么简单.虽然创建窗口的函数确实被命名为CreateWindow, 但您将发现 CreateWindow的第 ...

  2. [原创]ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 软件篇

    引言 在上一篇<ACPI.sys,从Windows到Bios的桥梁(2):Windows应用程序响应主板上GPIO(SCI)设备中断 硬件篇>只完成了2件事: 1.Bios接收GPIO S ...

  3. 预防Windows应用程序挂起

    预防Windows应用程序挂起 预防Windows应用程序挂起预防Windows应用程序挂起 受影响的平台 客户端  - Windows 7 服务器端  - Windows Server 2008 R ...

  4. Windows自动启动程序的十大藏身之所(转载)

    Windows自动启动程序的十大藏身之所 Windows启动时通常会有一大堆程序自动启动.不要以为管好了"开始→程序→启动"菜单就万事大吉,实际上,在Windows XP/2K中, ...

  5. linux里运行windows,在Linux上运行Windows应用程序

    当前位置:我的异常网» Linux/Unix » 在Linux上运行Windows应用程序 在Linux上运行Windows应用程序 www.myexceptions.net  网友分享于:2015- ...

  6. Visual Studio 2017 - Windows应用程序打包成exe文件(1)- 工具简单总结

    最近有对一个Windows应用程序少许维护和修改.修改之后要发布新的exe安装文件,打包exe文件时,遇到了很头疼的问题,还好最后解决了,记录一下. Visual Studio版本:Visual St ...

  7. Directx11 教程(2) 基本的windows应用程序框架(2)

    Directx11 教程(2) 基本的windows应用程序框架(2) 原文:Directx11 教程(2) 基本的windows应用程序框架(2) 在本教程中,我们把前面一个教程的代码,进行封装.把 ...

  8. 网页设计师的必备选择20 +必需的Windows应用程序

    今天给网页设计师推荐20几个windows下提高工作效率的应用程序,对于设计师来说是必不可少的,希望大家喜欢 1. Skybound Stylizer 虽然我更喜欢使用Firebug时,我发现&quo ...

  9. 安装JDK出现Windows Installer程序包有问题,此安装需要的DLL不能运行...

    之前改动了jdk1.6的安装位置,结果卸载的时候无法卸载,重新安装也不行,都提示windows installer 程序包有问题,如图所示 首先确保windows installer服务是开启的,运行 ...

最新文章

  1. 支持百亿请求的微博广告运维技术实践
  2. c语言趣味教学题目及答案,C语言趣味程序设计-题目百例.doc
  3. CentOS 上安装MYSQL+Apache+PHP
  4. Hi3516A开发--/etc/passwd
  5. PHPStorm无法保存个人设置 ctrl左键无法找到类
  6. 【2012百度之星/初赛上】B:小小度刷礼品
  7. 推荐一款免费国产远程办公神器ToDesk,TeamViewer完美替代品
  8. 华北电力大学依托大数据实施精准资助
  9. 每个人心中都有一片极乐净土
  10. 孩子们各显神通对付 iOS 12「屏幕使用时间」的限制
  11. zzulioj--1711--漂洋过海来看你(dfs+vector)
  12. SMB/CIFS--NetBOIS/Browser/NBNS 协议
  13. ubuntu22.04设置静态ip地址
  14. php编程输出心形图案_利用php输出不同的心形图案
  15. java数组乱码_Java 乱码问题
  16. 黑帽SEO网站优化常用的14种技巧
  17. 广告行业中那些趣事系列21:从理论到实战BERT知识蒸馏
  18. 调整DOSBox的窗口大小:跨过三连坑
  19. 小白要努力之为了蓝桥杯刷题!!!超简单哦!!!
  20. 用 LaTeX 写漂亮学位论文(from wloo)

热门文章

  1. HAProxy的日志配置以及ACL规则实现负载均衡
  2. Fragment 键盘弹出方式设置
  3. Hibernate type 与java 和 数据库类型对应
  4. 牛客网暑期ACM多校训练营(第二场)J farm (二维树状数组)
  5. python下sqlite增删查改方法(转)
  6. HQ-day2 C#语言基础
  7. Hello, AnnsShadow!
  8. 设计模式建议学习顺序
  9. java input回车,用java怎样编写加减乘除,从键盘输入,例如:1+2按回车得到
  10. scss2css vscode设置_VSCode下让CSS文件完美支持SCSS或SASS语法方法