2018-11-5-win10-uwp-异步转同步
| title | author | date | CreateTime | categories |
|---|---|---|---|---|
|
win10 uwp 异步转同步
|
lindexi
|
2018-11-05 10:18:40 +0800
|
2018-2-13 17:23:3 +0800
|
Win10 UWP
|
有很多方法都是异步,那么如何从异步转到同步?
在本文开始,我必须告诉大家,这个方法可能立即死锁,所以使用的时候需要满足下面的条件
使用的条件
异步转同步的线程不是 UI 线程
如果线程是UI线程,那么异步方法不能在另外一个线程。
看到这里也许你会疑惑,为何异步方法可以不在另一个线程?实际上对于 IO 等的异步方法,都是没有创建线程,请看There Is No Thread
关于这条件是如何来的,请看使用 Task.Wait()?立刻死锁(deadlock) - walterlv
使用方法
可以使用的方法需要获得是否有返回值,返回值是否需要。
如果需要返回值,使用GetResults
如从文件夹获取文件:
StorageFolder folder = StorageFolder.GetFolderFromPathAsync("").GetResults();
这是同步方法,几乎不需要做什么修改
如果是没有返回值或不需要返回值的,请看下面代码
StorageFolder.GetFolderFromPathAsync("").AsTask().Wait();
假设一个方法是没返回的,可以使用Wait
Foo().Wait();
private async Task Foo()
通过这个方法就可以把异步方法转同步。
如果需要反过来,把同步转异步,可以使用 同步方法转异步
await Task.Run(() =>
{
写你的代码
});
使用Task.Wait 时需要小心死锁
不会出现死锁的代码
直接在UI使用Task.Run
private void Button_OnClick(object sender, RoutedEventArgs e)
{
var n = Task.Run(() =>
{
return 2;
}).Result;
}
使用Task.Delay等待
private void Button_OnClick(object sender, RoutedEventArgs e)
{
Task.Delay(100).Wait();
}
即使使用方法,里面使用 io 也有可能死锁
private void Button_OnClick(object sender, RoutedEventArgs e)
{
DoAsync().Wait();
} private async Task DoAsync()
{
// 调用这个方法在 10.0.17134 / 10.0.16299 概率的死锁
// 在 10.0.17763 基本就会死锁
await ApplicationData.Current.LocalFolder.CreateFileAsync("lin", CreationCollisionOption.ReplaceExisting);
}
会出现死锁的写法
在UI使用异步会创建线程的方法
private void Button_OnClick(object sender, RoutedEventArgs e)
{
DoAsync().Wait();
} async Task DoAsync()
{
await Task.Run(() => { });
}
private void Button_OnClick(object sender, RoutedEventArgs e)
{
DoAsync().Wait();
} async Task DoAsync()
{
await Task.Delay(100);
}
private void Button_OnClick(object sender, RoutedEventArgs e)
{
DoAsync().Wait();
} private async Task DoAsync()
{
await Task.Run( () =>
{
ApplicationData.Current.LocalFolder.CreateFileAsync("123",
CreationCollisionOption.ReplaceExisting).GetResults();
});
}
2018-11-5-win10-uwp-异步转同步的更多相关文章
- win10 uwp 异步转同步
原文:win10 uwp 异步转同步 有很多方法都是异步,那么如何从异步转到同步? 可以使用的方法需要获得是否有返回值,返回值是否需要. 如果需要返回值,使用GetResults 如从文件夹获取文件: ...
- win10 uwp 异步进度条
本文主要讲我设计的几个进度条,还有如何使用异步控制进度条,如何使用动画做进度. 进度条可以参见:http://edi.wang/post/2016/2/25/windows-10-uwp-modal- ...
- win10 uwp MVVM 轻量框架
如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...
- win10 uwp 使用 Microsoft.Graph 发送邮件
在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...
- ASP.NET sync over async(异步中同步,什么鬼?)
async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...
- 【Win10 UWP】后台任务与动态磁贴
动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...
- 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖
文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...
- win10 UWP GET Post
win10 应用应该是要有访问网络,网络现在最多的是使用GET,Post,简单的使用,可以用网络的数据:获得博客的访问量. 在使用网络,我们需要设置Package.appxmanifest 网络请求使 ...
- win10 uwp smms图床
本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...
- ajax中的async属性值之同步和异步及同步和异步区别
jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...
随机推荐
- 神舟mini pcs-b wifi-bt 驱动
最新mini pcs ssd硬盘版 安装win10后蓝牙设备找不到,显示usb获取设备符失败, 卸载wifi驱动,安装以下驱动,两个链接应该都可以. TW: https://downloadcente ...
- Libevent:5events相关
Libevents的基本操作单元是event,每一个event代表了一些条件的集合,这些条件包括: 文件描述符已经准备好读或写 文件描述符正在变为就绪,准备好读或写(仅限于边沿触发) 超时事件 信号发 ...
- NDK(1)简介
AndroidNDK Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”. Android程序运行在Dalv ...
- Class.forName(“com.mysql.jdbc.Driver”)
传统的使用jdbc来访问数据库的流程为: Class.forName(“com.mysql.jdbc.Driver”); String url = “jdbc:mysql://localhost:33 ...
- Python3.6正向解析与反向解析域中主机
公司最近接手的一家跨国企业的项目,该企业单域.多站点,且遍布美国.巴西.日本.东京.新加坡等多个国家,服务器及客户端计算机数量庞大.由于处理一些特殊故障,需要找出一些不在域中的网络设备及存储.NBU等 ...
- IO NIO AIO及常用框架概述
概述 nio 同步: 自己亲自出马持银行卡到银行取钱(使用同步IO时,Java自己处理IO读写). 异步: 委托一小弟拿银行卡到银行取钱,然后给你(使用异步IO时,Java将IO读写委托给OS处理,需 ...
- @bzoj - 4381@ [POI2015] Odwiedziny
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一棵 n 个点的树,树上每条边的长度都为 1 ,第 i 个点 ...
- behavior planning——inputs to transition functions
the answer is that we have to pass all of the data into transition function except for the previous ...
- LRJ-Example-06-16-Uva10129
#include <cstdio> #include <cstring> #include <vector> using namespace std; + ; // ...
- 你看Http的 三次握手
你看Http的 三次握手 按层次分,TCP位于传输层,而且TCP协议能够确认数据是否送达到对方,所以在客户端请求资源的时候,你得让俺知道咱俩关系是不是已经确定了啊,对不.这跟谈恋爱一样一样的,得先确定 ...