首页
学习
活动
专区
工具
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同步的时间。

83331
  • 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

    44320

    Win2D 中的游戏循环:CanvasAnimatedControl

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

    97220

    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

    1K30

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

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

    44930

    缓存一致性与内存屏障

    所以要想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闲着?

    92561

    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

    去大厂面试,结果没想到一个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

    70400

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

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

    52020

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

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

    40930

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

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

    39320

    CPU多级缓存

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

    1.9K30

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

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

    9.2K135
    领券