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的时候会把页面里 ...
随机推荐
- oracle-Mount
执行nomount的所有工作,另外附加数据结构并与这些数据结构进行交互.这时,oracle从控制文件中获得信息. 可以执行的任务是: 执行数据库的完全恢复操作 重命名数据文件 改变数据库的归档状态. ...
- vue-cnodejs
感谢那些无私开源的程序员,你们是最可爱的人儿~~~~ //根app app.js <template> <div id="app"> <v-heade ...
- 微信小程序组件——详解wx:if elif else的用法
背景 在学习微信小程序开发wxml页面时,需要使用if,else来判断组件是否进行展示,代码如下 <view wx:if="{{is_login==1}}">成功登录& ...
- docker-其它命令
[root@iZ943kh74qgZ soft]# docker Usage: docker COMMAND A self-sufficient runtime for containers Opti ...
- 【JZOJ4888】【NOIP2016提高A组集训第14场11.12】最近公共祖先
题目描述 YJC最近在学习树的有关知识.今天,他遇到了这么一个概念:最近公共祖先.对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. ...
- Android Binder简介
Android使用Linux的进程管理机制,以进程为单位分配虚拟地址空间.为了安全考虑,Android的不同进程之间是相互隔离的(进程之间被禁止直接交互).如果进程间需要通信,必须通过Android的 ...
- 什么是Hessian协议呢?
什么是Hessian协议呢? 目前,Web服务技术是解决异构平台系统的集成及互操作问题的主流技术. 它所基于的XML已经是Internet上交换数据的实际标准,基于通用的进程间通信协议和网络传输协议屏 ...
- javascript导图 标签: javascript 2015-12-06 16:37 721人阅读 评论(24)
- Java练习 SDUT-1149_计算题
计算题 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 一个简单的计算,你需要计算f(m,n),其定义如下: 当m=1时 ...
- javascript实现html中关键字查询
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...