异步编程学习

UniTask

UniTask
访问UniTask的GitHub的主页可以直接下载unity Package进行导入,或者通过 Package Manager导入,导入完成之后根据文档加一下 宏定义“UNITASK_DOTWEEN_SUPPORT”
这样就可以正常的控制DoTween了

在这里插入图片描述

2.UniTask 的简单使用

// UniTask 是可以作用到DoTween上的 
using Cysharp.Threading.Tasks;
using DG.Tweening;
using System;
using System.Threading;
using UnityEngine;
using UnityEngine.UI;

public class UnitaskCancel : MonoBehaviour
{
	//当我们点击取消按钮的时候 会发送一个取消指令,接收到指令的UniTask都会取消
	// CacellationTokenSource 是原生的类
    private CancellationTokenSource cts = new CancellationTokenSource();
    [SerializeField] private Button cancelButton;
    [SerializeField] private Transform cube;
    private UniTask[] cancelTaskArray;
    
    private void Awake()
    {
        cancelButton.onClick.AddListener(cancel);
        InitUniTask();
    }
	
    private async void InitUniTask() {
        UniTask one = cube.DOMove(new Vector3(5, 0, 5), 2f).SetEase(Ease.InOutQuart).ToUniTask(cancellationToken:cts.Token);
        UniTask two = cube.DOScale(new Vector3(2, 2, 2), 5f).SetEase(Ease.InOutQuart).ToUniTask(cancellationToken: cts.Token);
        UniTask three = cube.DORotate(new Vector3(90, 90, 90), 2f).SetEase(Ease.InOutQuart).OnComplete(()=>{
            Debug.Log("CompleteDORotate");
        }).ToUniTask(cancellationToken: cts.Token);
        cancelTaskArray = new UniTask []{ one, two,three };
		// 等待全部的任务完成才会继续执行
		// 注意这里的任务 是一起开始的,如果想要一个一个完成 需要直接await 具体的Unitask
        var waitAll = UniTask.WhenAll(cancelTaskArray);
        //await UniTask.Delay(TimeSpan.FromSeconds(1f)) ;
        await waitAll;
        Debug.Log("Complete");
    }

    private void InitDotween() {
        cube.DOScale(new Vector3(2, 2, 2), 5f).SetEase(Ease.InOutQuart);
        cube.DORotate(new Vector3(90, 90, 90), 2f).SetEase(Ease.InOutQuart);
        cube.DOMove(new Vector3(5, 0, 5), 2f).SetEase(Ease.InOutQuart);
    }
    
    private void cancel() { 
        cts.Cancel();
    }
}

下一篇 将会使用UniTask完成一个小案例

<think>好的,用户想了解Rust异步编程学习和理解。首先,我需要回忆Rust异步编程的基本概念和核心机制。Rust的异步编程主要围绕async/await语法、Future trait、执行器(Executor)、反应器(Reactor)等部分展开。用户可能已经有一定的同步编程经验,现在想转向异步以提高性能,特别是在处理高并发、I/O密集型任务时。 接下来,用户可能的疑问点包括:为什么Rust选择基于生成器的异步模型?Future在Rust中是如何工作的?async/await背后的机制是什么?执行器和反应器各自扮演什么角色?还有常见的运行时如tokio和async-std的区别和使用场景。 需要分步骤解释,从基本概念入手,逐步深入。首先介绍异步编程解决的问题,然后讲解Future trait,接着是async/await语法糖,再讨论执行器和反应器如何协作,最后提到生态中的运行时库。同时要提醒常见的陷阱,比如阻塞操作在异步任务中的影响,以及Pin和Unpin的作用。 可能用户的实际需求是在项目中高效处理大量网络请求或文件I/O,所以需要强调Rust异步在性能上的优势,比如零成本抽象和避免全局运行时开销。此外,应该提供简单的代码示例,展示如何定义异步函数和使用.await,以及选择运行时库的基本方法。 还要注意用户的潜在问题,比如错误处理、任务取消、跨线程调度等高级话题,但初次学习可能不需要深入这些细节,点到为止即可。最后,总结学习路径,推荐官方文档和社区资源,帮助用户继续深入学习。</think>以下是Rust异步编程的核心概念分步解析(建议结合代码实践理解): 一、同步与异步的本质区别 同步模型:线程阻塞等待I/O完成 → 高并发时线程切换开销大 异步模型:单线程内多任务交替执行 → 通过状态机实现非阻塞 二、Rust异步核心三要素 1. Future trait(异步计算抽象) ```rust pub trait Future { type Output; fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output>; } ``` - 每个async块编译后生成实现Future的状态机 - poll方法驱动状态机推进(非递归调用) 2. 执行器(Executor) - 线程池调度管理Future任务 - 典型实现:tokio::runtime、async-std::task 3. 反应器(Reactor) - 事件循环监控I/O就绪状态 - 通过epoll/kqueue/IOCP等系统调用实现 三、async/await工作流程 1. 定义异步函数 ```rust async fn fetch_data() -> Result<String, io::Error> { // 模拟异步操作 tokio::time::sleep(Duration::from_secs(1)).await; Ok("Data".to_owned()) } ``` 2. 执行异步任务 ```rust #[tokio::main] async fn main() { let data = fetch_data().await.unwrap(); println!("{}", data); } ``` 四、运行时选择策略 | 特性 | tokio | async-std | |-------------|------------------|-------------------| | 设计目标 | 高性能网络应用 | 更接近标准库体验 | | 定时器精度 | 毫秒级 | 秒级 | | 社区生态 | 丰富插件生态 | 逐渐增长 | | 适用场景 | 复杂网络服务 | CLI工具/简单服务 | 五、关键注意事项 1. 避免阻塞:同步代码需用`spawn_blocking`隔离 2. 生命周期:`.await`可能导致引用失效,需用`Arc`共享 3. Pin约束:自引用结构必须固定内存地址 4. 取消传播:`select!`宏可处理多任务竞争 学习路线建议: 1. 掌握Future基础 → 2. 理解executor/reactor协作 → 3. 熟悉常见运行时API → 4. 实践典型并发模式(如channel、semaphore)→ 5. 研究高级优化技巧(如零拷贝IO) 推荐实践项目: - 异步Web爬虫 - TCP聊天服务器 - 并行文件处理器 - 自定义Future实现 官方资源: - 《Rust异步编程指南》(官方文档) - tokio官网教程(含丰富示例) - async-book中文版(社区翻译)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值