title author date CreateTime categories
win10 uwp 异步转同步
lindexi
2018-11-05 10:18:40 +0800
2018-2-13 17:23:3 +0800
Win10 UWP

有很多方法都是异步,那么如何从异步转到同步?

在本文开始,我必须告诉大家,这个方法可能立即死锁,所以使用的时候需要满足下面的条件

使用的条件

  1. 异步转同步的线程不是 UI 线程

  2. 如果线程是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();
});
}

参见:使用 Task.Wait()?立刻死锁(deadlock) - walterlv

2018-11-5-win10-uwp-异步转同步的更多相关文章

  1. win10 uwp 异步转同步

    原文:win10 uwp 异步转同步 有很多方法都是异步,那么如何从异步转到同步? 可以使用的方法需要获得是否有返回值,返回值是否需要. 如果需要返回值,使用GetResults 如从文件夹获取文件: ...

  2. win10 uwp 异步进度条

    本文主要讲我设计的几个进度条,还有如何使用异步控制进度条,如何使用动画做进度. 进度条可以参见:http://edi.wang/post/2016/2/25/windows-10-uwp-modal- ...

  3. win10 uwp MVVM 轻量框架

    如果在开发过程,遇到多个页面之间,需要传输信息,那么可能遇到设计的问题.如果因为一个页面内包含多个子页面和多个子页面之间的通信问题找不到一个好的解决方法,那么请看本文.如果因为ViewModel代码越 ...

  4. win10 uwp 使用 Microsoft.Graph 发送邮件

    在 2018 年 10 月 13 号参加了 张队长 的 Office 365 训练营 学习如何开发 Office 365 插件和 OAuth 2.0 开发,于是我就使用 UWP 尝试使用 Micros ...

  5. ASP.NET sync over async(异步中同步,什么鬼?)

    async/await 是我们在 ASP.NET 应用程序中,写异步代码最常用的两个关键字,使用它俩,我们不需要考虑太多背后的东西,比如异步的原理等等,如果你的 ASP.NET 应用程序是异步到底的, ...

  6. 【Win10 UWP】后台任务与动态磁贴

    动态磁贴(Live Tile)是WP系统的大亮点之一,一直以来受到广大用户的喜爱.这一讲主要研究如何在UWP应用里通过后台任务添加和使用动态磁贴功能. 从WP7到Win8,再到Win10 UWP,磁贴 ...

  7. 入门级的按键驱动——按键驱动笔记之poll机制-异步通知-同步互斥阻塞-定时器防抖

    文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键, ...

  8. win10 UWP GET Post

    win10 应用应该是要有访问网络,网络现在最多的是使用GET,Post,简单的使用,可以用网络的数据:获得博客的访问量. 在使用网络,我们需要设置Package.appxmanifest 网络请求使 ...

  9. win10 uwp smms图床

    本文,如何使用smms图床上传图片,用到win10 uwp post文件,因为我是渣渣,如果本文有错的,请和我说,在本文评论,或发给我邮箱lindexi_gd@163.com,请不要发不良言论 找到一 ...

  10. ajax中的async属性值之同步和异步及同步和异步区别

    jquery中ajax方法有个属性async用于控制同步和异步,默认是true,即ajax请求默认是异步请求,有时项目中会用到AJAX同步.这个同步的意思是当JS代码加载到当前AJAX的时候会把页面里 ...

随机推荐

  1. 跟我一起认识axure(一)

    第一步下载:https://www.axure.com.cn/ 第二步点击安装,一路next 第三步:认识Axure RP工作界面

  2. C#中App.config文件配置获取

    最新的framework使用如下方法: using System.Configuration; ConfigurationManager.AppSettings["key"]; A ...

  3. [React Native]去掉WebStorm中黄色警告

    用WebStorm开发RN难免会碰到一大堆黄色警告.就像下面这样. 其实这个错误并不会影响开发,但是作为一个上升处女座的,我很难忍.于是各种想办法. 上网查了半天发现这篇文章 http://blog. ...

  4. hdu2577 dp

    也可以字符串搞.dp思路还是很清晰的.dp[][0]表示未锁定,dp[][1]表示锁定键. #include<stdio.h> #include<string.h> #defi ...

  5. ubuntu18.10 安装pycurl

    sudo apt-get install libcurl3 sudo apt-get install libcurl4-openssl-devsudo apt-get install python3 ...

  6. spoj SUBLEX (Lexicographical Substring Search) RE的欢迎来看看

    SPOJ.com - Problem SUBLEX 这么裸的一个SAM,放在了死破OJ上面就是个坑. 注意用SAM做的时候输出要用一个数组存下来,然后再puts,不然一个一个字符输出会更慢. 还有一个 ...

  7. Spring Security入门篇——标签sec:authorize的使用

    Security框架可以精确控制页面的一个按钮.链接,它在页面上权限的控制实际上是通过它提供的标签来做到的 Security共有三类标签authorize authentication accessc ...

  8. ros 工作空间下cpp文件调用其他cpp文件的函数或变量

    最近在学习ros节点编程,在工作空间下添加如下文件: message.h #ifndef MESSAGE_H #define MESSAGE_H extern int n; void init_ros ...

  9. Hbase数据模型 列族

  10. NLP突破性成果 BERT 模型详细解读 bert参数微调

    https://zhuanlan.zhihu.com/p/46997268 NLP突破性成果 BERT 模型详细解读 章鱼小丸子 不懂算法的产品经理不是好的程序员 ​关注她 82 人赞了该文章 Goo ...