C# 异步转同步 PushFrame

异步转同步-PushFrame

本文通过PushFrame,实现异步转同步

首先有一个异步方法,如下异步任务延时2秒后,返回一个结果

1     private static async Task<string> TestWithResultAsync()
2     {
3         Debug.WriteLine("1. 异步任务start……");
4         await Task.Delay(2000);
5         Debug.WriteLine("2. 异步任务end……");
6         return "2秒以后";
7     }

在UI线程执行此任务,尝试转化为同步

1     private void PushFrameTaskResult_OnClick(object sender, RoutedEventArgs e)
2     {
3         var result = AwaitByPushFrame(TestWithResultAsync());
4         Debug.WriteLine($"PushFrameTaskResult_OnClick end:{result}");
5     }

PushFrame异步转同步的实现:

 1     public static TResult AwaitByPushFrame<TResult>(Task<TResult> task)
 2     {
 3         var frame = new DispatcherFrame();
 4         task.ContinueWith(t =>
 5         {
 6             frame.Continue = false;
 7         });
 8         Dispatcher.PushFrame(frame);
 9         return task.Result;
10     }

测试结果:

Task不带返回值的处理:

1     public static void AwaitByPushFrame(Task task)
2     {
3         var frame = new DispatcherFrame();
4         task.ContinueWith(t =>
5         {
6             frame.Continue = false;
7         });
8         Dispatcher.PushFrame(frame);
9     }

PushFrame的缺陷

PS:pushFrame虽然能够实现异步转同步,但也有缺陷,可以选择性的使用

PushFrame的详细原理及缺陷,可参考小伙伴水先生的《 深入了解 WPF Dispatcher 的工作原理(PushFrame 部分)

原文地址:https://www.cnblogs.com/kybs0/p/11148847.html

时间: 2024-11-10 16:13:52

C# 异步转同步 PushFrame的相关文章

异步复位同步释放

同步复位与异步复位的优缺点 同步复位的优点: 一般能够确保电路是百分之百同步的. 确保复位只发生在有效时钟沿,可以作为过滤掉毛刺的手段. 同步复位的缺点: 复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位.同时还要考虑如:时钟偏移.组合逻辑路径延时.复位延时等因素. 由于大多数的厂商目标库内的触发器都只有异步复位端口,采用同步复位的话,就会耗费较多的逻辑资源. 异步复位优点: 异步复位信号识别方便,而且可以很方便的使用全局复位. 由于大多数的厂商目标库内的触发器都有异步复位端口,

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

文章对应视频的第12课,第5.6.7.8节. 在这之前还有查询方式的驱动编写,中断方式的驱动编写,这篇文章中暂时没有这些类容.但这篇文章是以这些为基础写的,前面的内容有空补上. 按键驱动——按下按键,打印键值: 目录 概要 poll机制 异步通知 同步互斥阻塞 定时器防抖 概要: 查询方式: 12-3 缺点:占用CPU99%的资源.中断方式:12-4 缺点:调用read函数后如果没有按键按下,该函数永远不会结束,一直在等待按键按下. 优点:使用到了休眠机制,占用cpu资源极少.poll机制: 1

异步复位 同步释放

在FPGA设计中常遇到复位的设计,一般情况下,复位分为同步复位和异步复位. 异步复位与同步复位相比,其利用到了D触发器的CLR端,消耗硬件资源小,所以在很多情况下各个模块的复位方式选取为异步复位.但是异步信号容易产生潜在的危险:当异步复位信号在时钟上升沿附近取消复位状态时,时序电路很可能在此出现问题. 解决这个问题的一个方法为,对异步复位信号进行预处理,使其成为异步复位.同步释放的形式. 我设计的电路如下: library ieee; use ieee.std_logic_1164.all; u

异步执行同步等待结果

需求: 我们的Server服务接收Http请求,经过一系列的异步请求其它Server(对,我们的Server是一个FrontServer)后,生成最终的结果,返回给请求者. 在这个过程中,需要我们的Server等待一定时间,如果结果无法得出,也需要给前端返回错误码. 这是一个非常常见的需求,我们的方案很朴素,直接用POSIX的pthread_xx 函数调用,具体如下 struct SessionTask { pthread_mutex_t result_lock; pthread_cond_t

Tornado源码分析系列之一: 化异步为&#39;同步&#39;的Future和gen.coroutine

转自:http://blog.nathon.wang/2015/06/24/tornado-source-insight-01-gen/ 用Tornado也有一段时间,Tornado的文档还是比较匮乏的,但是幸好其代码短小精悍,很有可读性,遇到问题时总是习惯深入到其源码中.这对于提升自己的Python水平和对于网络及HTTP的协议的理解也很有帮助.本文是Tornado源码系列的第一篇文章,网上关于Tornado源码分析的文章也不少,大多是从Event loop入手,分析Event loop的工作

非主流node.js异步转同步

异步转同步方案分类 说起nodejs的异步转同步,估计大家不陌生.因为nodejs回调实在太多了,稍微复杂一点的程序就会有很多层的回调嵌套.为了处理这些令人抓狂的回调,我们一般需要使用一些框架或工具将这些异步过程转换成相对比较容易理解的同步过程,也就是我们本文所说的异步转同步.而完成这种转换的工具或库大体上可以分为三类:1. 回调链管理类 2. 编译工具类 3. 底层实现修改类. 第一类是最工具常见的,以Promise.async为代表.这类工具一般需要调用一个方法将我们 的处理函数包裹然后进行

关于Node.js异步转同步

用Node.js做开发我们有时候会很沉浸在它的异步回调机制中.发送一个请求,不管什么时候响应,我们写好一个对应的回调函数(callback),然后我们就可以进行下一步的操作.但是有时候我们又会陷入苦恼之中,比如说我必须在取得回调之后的数据之后才能进行接下来的操作,那么我们就要想办法转异步为同步了. 最常见的异步操作: Async(parameters,function(){ //回调操作 }) 但是如果在回调里面还有另外的回调,那我们就会陷入深深的回调泥潭里.步入正题,Node.js提供原生的P

阻塞、非阻塞、异步、同步以及select/poll和epoll

针对IO,总是涉及到阻塞.非阻塞.异步.同步以及select/poll和epoll的一些描述,那么这些东西到底是什么,有什么差异? 一般来讲一个IO分为两个阶段: 等待数据到达 把数据从内核空间拷贝到用户空间 现在假设一个进程/线程A,试图进行一次IO操作. A发出IO请求,两种情况: 1)立即返回 2)由于数据未准备好,需要等待,让出CPU给别的线程,自己sleep 第一种情况就是非阻塞,A为了知道数据是否准备好,需要不停的询问,而在轮询的空歇期,理论上是可以干点别的活,例如喝喝茶.泡个妞.

什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么(转)

1.什么是同步逻辑和异步逻辑,同步电路和异步电路的区别是什么?     同步逻辑是时钟之间有固定的因果关系.异步逻辑是各时钟之间没有固定的因果关系.     电路设计可分类为同步电路和异步电路设计.同步电路利用时钟脉冲使其子系统同步运作,而异步电路不使用时钟脉冲做同步,其子系统是使用特殊的“开始”和 “完成”信号使之同步.由于异步电路具有下列优点--无时钟歪斜问题.低电源消耗.平均效能而非最差效能.模块性.可组合和可复用性--因此近年来对异步 电路研究增加快速,论文发表数以倍增,而Intel P