首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CanvasVirtualControl,Invalidate作为异步工作,如何让它等待?

CanvasVirtualControl是Windows Runtime API中的一个类,用于在应用程序中创建和管理虚拟画布。它提供了一种高性能的方式来呈现大型、动态的图形和图像。

Invalidate是CanvasVirtualControl类中的一个方法,用于标记虚拟画布的内容已过时并需要重新绘制。通常情况下,Invalidate方法是同步执行的,即在调用该方法后立即重新绘制画布。然而,有时候我们希望将Invalidate方法的执行延迟到异步工作完成后再进行,以避免在异步工作进行时频繁地重新绘制画布。

要实现让Invalidate方法等待异步工作完成后再执行,可以使用异步编程模型中的await关键字。具体步骤如下:

  1. 将Invalidate方法的调用放在一个异步方法中。
  2. 在异步方法中执行需要等待的异步工作,可以是一个异步操作、一个任务或者一个异步事件。
  3. 在异步工作完成后,使用await关键字等待Invalidate方法的执行。

以下是一个示例代码:

代码语言:txt
复制
private async void DoAsyncWork()
{
    // 执行异步工作
    await Task.Delay(1000); // 假设这里是一个异步操作,延迟1秒钟

    // 异步工作完成后,执行Invalidate方法
    MyCanvas.Invalidate();
}

在上述示例中,DoAsyncWork方法是一个异步方法,其中使用了await关键字等待异步工作完成。在异步工作完成后,调用了Invalidate方法来重新绘制画布。

需要注意的是,使用await关键字等待异步工作完成后再执行Invalidate方法,需要确保DoAsyncWork方法本身是在UI线程上调用的,以避免在UI线程之外更新UI元素。

关于CanvasVirtualControl的更多信息和使用方法,可以参考腾讯云的相关文档和示例代码:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Java并发编程】- 03 MESI、内存屏障

如红色框框标记这个区间内,CPU0是一直处于等待状态的,现在计算机CPU核数都比较多,可能要等所有的CPU核都返回ack确认消息后才能继续工作,造成CPU0资源被白白的浪费。...store-buffer是处于CPU核中的另一个缓存,当存在修改时,把修改直接放到store-buffer中,store-buffer后台异步方式发送invalidate通知到其它CPU以及处理ack确认等工作...还以刚才场景为例,CPU0修改cache line后,直接丢给store-buffer,store-buffer处理后续和其它CPU同步问题,自己可以接着干下面工作,store-buffer采用异步方式发送...CPU0中的cache line被修改后直接丢给store-buffer,store-buffer是异步处理方式,这时CPU0继续处理后续工作,其它CPU的cache line由于还没有来得及通知可能还是旧数据...也是比较耗时的工作,通过invalidate queues引入,缩短了store-buffer同步的时间。

80931

win10 uwp 通过 win2d 画出笔迹 界面笔迹性能原理完全控制墨迹多指输入转换笔迹无限漫游

本文告诉大家如何在 UWP 上 win2d 画出笔迹,通过实际测试发现在 UWP 的笔迹的性能比在 WPF 高很多。...将笔迹转为静态就可以笔迹变为一个界面元素,参与界面的变化,如选择和层级这些业务。...win2d 上画出静态笔迹 Canvas.Draw += CanvasControl_Draw 在这个函数里面可以通过 win2d 画出任意的内容 但是需要知道在什么时候开始画,同时 win2d 需要调用 Invalidate...InkStrokesCollectedEventArgs args) { _pendingDry = inkSynchronizer.BeginDry(); Canvas.Invalidate...CanvasDrawingSession ds = sender.CreateDrawingSession()) { ds.DrawInk(_pendingDry); } 无限漫游 如果现有做无限漫游,可以使用 CanvasVirtualControl

1K20

win10 uwp 通过 Win2d 完全控制笔迹绘制逻辑

本文来告诉大家如何通过 Win2d 完全控制笔迹绘制逻辑,本文适合用来实现复杂的自定义逻辑,可以完全控制笔迹的行为。...本文提供的方法的性能依然不如只使用默认的 InkCanvas 快 界面 在开始之前,请先安装 Win2d 库,可参阅 win10 uwp win2d 入门 看这一篇就够了 博客了解如何安装 在 XAML...InkCanvas 作为快速的事件接收层, Win2d 的 CanvasControl 作为实际的绘制层。...请在自己的产品逻辑里面,手动分开为多个不同的笔迹段,用来提升性能 上面代码通过调用 CanvasControl 的 Invalidate Win2d 的画布重新绘制。...这样也能提升笔迹的动态绘制性能,因为笔迹在绘制的时候需要不断调用 Win2d 的刷新,如果此时刷新的是一个只包含很少笔迹的动态笔迹层的画布,那每次刷新的性能就比较好 无限漫游 如果需要做无限漫游,可以使用 CanvasVirtualControl

42220

Win2D 中的游戏循环:CanvasAnimatedControl

当然,我自己是有一部 Lumia 950XL 的,你可以在 使用 Windows 10 中的加速度计(Accelerometer,重力传感器) 一文中看到的身影。...准备工作 要使用 Win2D 进行简单的游戏开发,你需要先配置好一些 UWP 的开发环境,并且在你的项目中安装 Win2D.uwp 的 NuGet 包。...阅读 win10 uwp win2d 入门 看这一篇就够了 - 林德熙 了解如何在你的项目中安装 Win2D,并且了解 Win2D 基本的知识。...你可以阅读 使用 Win2D 绘制带图片纹理的圆(或椭圆) 了解如何绘制这样的塑料弹球。...ds.FillRectangle(FullBounds, Colors.White); } } } 你也可以使用事件参数 CanvasCreateResourcesEventArgs 来追踪这个异步加载任务

95420

Linux内核:memory barrier

然而,这种优化产出的结果未必符合程序员原始的逻辑,因此,作为程序员,作为c程序员,必须有能力了解编译器的行为,并在通过内嵌在c代码中的memory barrier来指导编译器的优化行为(这种memory...作为一个c程序员,你可能会抱怨,为何设计CPU的硬件工程师不能屏蔽掉memory barrier的内容,c程序员关注在自己需要关注的程序逻辑上呢?本章可以展开叙述,或许能解决一些疑问。...(3)Invalidate Queue 我们先回忆一下为何出现了stroe buffer:为了加快cache miss状态下写的性能,硬件提供了store buffer,以便CPU先写入,从而不必等待...如果cache正忙于其他工作,当然不能立刻执行invalidate命令,也就无法会ack。 怎么破?CPU设计的硬件工程师提供了下面的方法: ?...2、发送read命令,试图加载b对应的cacheline 注:这里cpu必须等待read response,下面的指令依赖于这个读取的结果 收到来自CPU 0的invalidate命令,放入invalidate

99630

关于这个知识点,我被读者骂到回家种田

时间局部性:如果一个信息项正在被访问,那么在近期很可能还会被再次访问 空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用 缓存为什么会不一致 缓存的出现 CPU 的利用率得到了大幅地提高...如果共享一组缓存,由于低级缓存(离 CPU 近的缓存)的空间非常小,多个 CPU 的时间会都花在等待使用低级缓存上面,这意味着多个 CPU 变成了串行工作,如果变成串行,那就失去了多核的本质意义——并行...总线嗅探 基于目录依赖实现的缓存一致性协议虽然带宽占用小,但是延迟高,并不适合作为小型的系统的缓存一致性解决方案,小型系统更多的是用基于总线嗅探的缓存一致性协议。...那如何解决 store buffer 的引入带来的全局顺序性问题呢?...对于第二个观点,我的看法是: JMM 是一个虚拟的内存模型,抽象了 JVM 的运行机制, Java 开发人员能更好的理解 JVM 的运行机制,封装了 CPU 底层的实现, Java 的开发人员可以更好的进行开发

42830

缓存一致性与内存屏障

所以要想Cache充分发挥作用,必须做点“多余”的事情。因此从内存中获取数据的时候,我们把包含目标数据的一整块内存数据都放入Cache中。别小看这个动作,它有个科学的解释,叫做空间局部性。...CPU是何等宝贵的资源,闲着是不可能的,绝对不可能的!硬件工程师为了解决这个问题,引入了Store Buffers。6.1....Store Buffer的加入导致Read Invalidate的发送是一个异步操作,异步可能导致的结果就是CPU 1 接收到CPU 0 的Read Invalidate消息太晚了,导致在Cache中的实际操作顺序是...很多人看到「乱序执行」唯恐避之不及,当初可是为了提高CPU的工作效率而诞生的,而且在大多数情况下并不会导致什么错误,只是在多处理器(smp)并发执行的时候可能会出现问题,于是便有了下文。...如何保证有序呢?最简单的方式就是CPU傻等,CPU 0 在执行第5步之前必须等着CPU 1给出反馈,直到清空自己的Store Buffer,然后才能继续向下执行。啥?又CPU闲着?

79761

去大厂面试,结果没想到一个Handler还有中高级几种问法,我慌了...

如果你设计一个ThreadLocal,ThreadLocal 的目标是不同的线程有不同的变量 V,那最直接的方法就是创建一个 Map,的 Key 是线程,Value 是每个线程拥有的变量 V,ThreadLocal...当 next() 方法在取 Message 时发现队头是一个同步屏障的消息时,就会去遍历整个队列,只寻找设置了异步标志的消息,如果有找到异步消息,那么就取出这个异步消息来执行,否则就让 next() 方法陷入阻塞状态...而所有消息默认都是同步消息,只有手动设置了异步标志,这个消息才会是异步消息。另外,同步屏障消息只能由内部来发送,这个接口并没有公开给我们使用。...每个Activity的根布局都是DecorView,而DecorView的parent又是ViewRootImpl,所以在子View里执行invalidate()之类的工作,循环找parent,最后都会找到...Handler中的同步方法 如何handler.post消息执行之后然后再继续往下执行,同步方法runWithScissors public final boolean runWithScissors

68100

WPF 底层 从手指触摸屏幕到笔迹在屏幕显示中间的步骤

从 RealTime Stylus 到 WPF 框架经过 PenIMC 模块,请看 WPF 触摸底层 PenImc 是如何工作的 而 WPF 尽管可以在 Stylus Input 线程使用 PenThreadWorker...通过 RealTime Stylus 机制快速获取触摸点,但是 WPF 为了业务逻辑更好实现,此时将会在在主线程触发 Touch 或 Stylus 事件。...因此如果监听 Touch 等这些事件,那么将需要等待线程切换和等待主线程忙碌。...指令,显卡就会进行工作,为了整体效率最高,系统层或者说 DirectX 将会打包多个 Draw call 指令,一次交给 GPU 去渲染 而经过了渲染管线之后是否就能在屏幕上实际显示?...StylusPlugIn 原理 WPF 最小的代码使用 DynamicRenderer 书写 WPF 使用 Composition API 做高性能渲染 WPF 使用 Win2d 渲染 win10 uwp win2d CanvasVirtualControl

1.2K20

Redis 6.0的新特性:多线程、客户端缓存与安全

Redis避免频繁内核进行网络请求处理,可很好地提升请求处理效率。...但这个方法要求在Redis的整体架构中,添加对用户态网络协议栈的支持,需修改Redis源码中和网络相关的部分(例如修改所有的网络收发请求函数),这会带来很多开发工作量。...和普通模式不同,在广播模式下,即使客户端还没读取过K,但只要注册了要跟踪的K,服务端都会把K失效消息通知给这客户端。...案例 -客户端如何使用广播模式接收key失效消息 当我们在客户端执行下面的命令后,如果服务端更新了user1003这个key,那么,客户端就会收到invalidate消息。...案例 如何使用RESP 2协议的客户端也能接受失效消息? 假设客户端B想获取失效消息,但客户端B只支持RESP 2协议,客户端A支持RESP 3协议。

44220

全网最硬核 Java 新内存模型解析与实验 - 3. 硬核理解内存屏障(CPU+编译器)

大部分程序都表现出较高的局部性(locality): 如果处理器读或写一个内存地址,那么很可能很快还会读或写同一个地址。 如果处理器读或写一个内存地址,那么很可能很快还会读或写附近的地址。...,等待 CPU A 的 Invalidate Acknowledge 响应之后,状态修改为 Exclusive。...Invalidate 消息不用 CPU Stall 等待 Invalidate Response。...因为 CPU 内部也有不同的组件,我们可以将执行一条指令分成不同阶段,不同的阶段涉及的组件不同,这样伪解耦可以每个组件独立的执行,不用等待一个指令完全执行完再处理下一个指令。...所以,大家通过一种标准来抽象描述不同的 CPU 的乱序现象(即第一个操作为 M,第二个操作为 N,这两个操作是否会乱序,是不是很像 Doug Lea 对于 JMM 的描述,其实 Java 内存模型也是参考这个设计的

38830

全网最硬核 Java 新内存模型解析与实验单篇版(不断更新QA中)

Invalidate 消息不用 CPU Stall 等待 Invalidate Response。...因为 CPU 内部也有不同的组件,我们可以将执行一条指令分成不同阶段,不同的阶段涉及的组件不同,这样伪解耦可以每个组件独立的执行,不用等待一个指令完全执行完再处理下一个指令。...acquire 的作用是作为接收点解包后面的都看到包里面的内容,类比简易 CPU 模型,其实就是阻塞等待 invalidate queue 完全处理完保证 CPU 缓存没有脏数据。...release 的作用是作为发射点将前面的更新打包发出去,类比简易 CPU 模型,其实就是阻塞等待 store buffer 完全刷入 CPU 缓存。...,C1编译执行,C2编译执行,同时对于 JIT 编译还会修改编译参数的编译代码效果不一样。

35420

CPU多级缓存

内存如果要达到目前CPU那样的速度,那么的造价恐怕要贵上好几个数量级。所以,CPU的运算速度要比内存读写速度快很多,这样会使CPU花费很长的时间等待数据的到来或把数据写入到内存中。...因为这个等待远远比一个指令的执行时间长的多。所以,为了为了避免这种阻塞导致时间的浪费,引入了存储缓存(Store Buffer)和无效队列(Invalidate Queue)。...(1) 存储缓存 在没有存储缓存时,CPU 要写入一个量,有以下情况: 量不在该 CPU 缓存中,则需要发送 Read Invalidate 信号,再等待此信号返回,之后再写入量到缓存中。...而如果是 Shared 则需要发送 Invalidate 消息其它 CPU 感知到这一更改后再更改。 这些情况中,很有可能会触发该 CPU 与其它 CPU 进行通讯,接着需要等待它们回复。...本质原因是CPU为了效率,将长费时的操作“异步”执行,排在后面的指令不等前面的指令执行完毕就开始执行后面的指令。而且允许排在前面的长费时指令后于排在后面的指令执行完。

1.8K30

“终于懂了” 系列:Android屏幕刷新机制—VSync、Choreographer 全面理解!

在屏幕刷新中如何工作的? 可能你还听过屏幕刷新使用 双缓存、三缓存,这又是啥意思呢? 可能你还听过神秘的Choreographer,这又是干啥的? 小朋友,你是否有很多问号?...当第2帧数据准备完成后,并不会马上被显示,而是要等待下一个VSync 进行缓存交换再显示。 所以总的来说,就是屏幕平白无故地多显示了一次第1帧。...那如何 CPU/GPU计算在 Vsyn到来时进行呢?...而B完成后,又因为缺乏VSync pulse信号,只能等待下一个signal的来临。于是在这一过程中,有一大段时间是被浪费的。...5.3 原理 同步屏障消息 是如何 挡住普通消息来保证异步消息优先处理的?

8.3K125
领券