Unity C# 之 Task、async和 await 结合使用的一些情况处理

这篇具有很好参考价值的文章主要介绍了Unity C# 之 Task、async和 await 结合使用的一些情况处理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity C# 之 Task、async和 await  结合使用的一些情况处理

目录

Unity C# 之 Task、async和 await  结合使用的一些情况处理

一、简单介绍

二、把 async 函数,通过变化转为一般的函数

三、在 async 函数中,切换到主线程,并等待主线程执行完毕,继续 async 中的代码


一、简单介绍

Unity 在使用 Task 结合 async (await) 的时候,偶尔会遇到一些特殊情况,需要进行一些简单变化的处理,在这里自己做一个简单的记录,以便后期使用的时候参考。

Task 看起来像一个Thread,实际上,它是在ThreadPool的基础上进行的封装,Task的控制和扩展性很强,在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool。

async 和 await ,await 运算符暂停对其所属的 async 方法的求值,直到其操作数表示的异步操作完成。 异步操作完成后,await 运算符将返回操作的结果(如果有)。 当 await 运算符应用到表示已完成操作的操作数时,它将立即返回操作的结果,而不会暂停其所属的方法。 await 运算符不会阻止计算异步方法的线程。 当 await 运算符暂停其所属的异步方法时,控件将返回到方法的调用方。
 

在方法里加上了 async 关键字后,注意:返回值就只能使用固定的几个了,不然会报错

  1. 异步函数的返回类型只能为: void、Task、Task<TResult>、ValueTask 或 ValueTask<TResult>
  2. Task<TResult>: 代表一个返回值T类型的操作。
  3. Task: 代表一个无返回值的操作。
  4. void: 为了和传统的事件处理程序兼容而设计。

二、把 async 函数,通过变化转为一般的函数

情况是这样的,在一个开发需求中

  • 1)需要把一些函数定义在一个字典Dictionary 中,字典形式是Dictionary<string,func<string,string>>
  • 2)在添加函数时,有一个接口是 async Task<string> MethodAsync(string) 形式的,不能正常添加到字典中

此时,就需要把之前的 async Task<string> MethodAsync(string)  函数进行二次封装,变为可以赋值到字典中的函数形式,就是通过获取到 async Task<string> MethodAsync(string) 函数的 Task<string> 获取 Task 任务,执行 Task.wait() 等待,获取 Task.Result() 结果即可,参考代码如下,最后把 Method 的方法添加到字典中即可

//之前的函数形式
async Task<string> MethodAsync(string);

// 重新封装为可以正常调用的函数形式
string Method(string){

        // 将异步任务等待并获取结果
        Task<string> task = MethodAsync(string);
        task.Wait(); // 或者使用 task.Result

        return task.Result;
}

三、在 async 函数中,切换到主线程,并等待主线程执行完毕,继续 async 中的代码

情况是这样的,在 Unity 开发中,需要async 开发来避免阻塞主线程,分担主线程的压力,但是在Unity 中有些函数必须在主线程执行,如果在 async 线程中执行你会得不到想要的结果。

处理方式如下:

1) 在 async 函数中,把需要的在主线程执行的代码切换的主线程,使用Loom.QueueOnMainThread(()=>{需要在主线程执行的代码;})(这里使用 Loom 封装,进行主子线程切换,大家网上搜索 C#  Loom即可找到该函数的封装)

2)如果只是上面操作,可能主子线程各自执行,子线程不会等待主线程完成

3)如果需要子线程等待主线程执行完毕之后,才执行子线程的代码,可以创建一个 TaskCompletionSource<bool> ,在子线程中等待 await TaskCompletionSource.Task 该 任务完成标志,所以这是 主线程执行完后TaskCompletionSource 设置为 true 即可,即是 TaskCompletionSource.SetResult(true) ,参考代码如下文章来源地址https://www.toymoban.com/news/detail-816068.html

private async Task<string> MethodAsync() {

        // 创建一个 TaskCompletionSource
        var tcs = new TaskCompletionSource<bool>();
        string reslt= "";

        Loom.QueueOnMainThread(() => {
                // 主线程处理代码过程
                ......

                reslt=  "处理获取结构";

                // 完成 TaskCompletionSource,使得任务线程继续执行
                tcs.SetResult(true);
            });

            // 切换到主线程执行一段代码
            await tcs.Task;

        return reslt;
        
    } 


private async Task<string> MethodAsync() {

        // 创建一个 TaskCompletionSource
        var tcs = new TaskCompletionSource<bool>();
        string reslt= "";
        await System.Threading.Tasks.Task.Run(async () => {

            Loom.QueueOnMainThread(() => {
                // 主线程处理代码过程
                ......

                reslt=  "处理获取结构";

                // 完成 TaskCompletionSource,使得任务线程继续执行
                tcs.SetResult(true);
            });

            // 切换到主线程执行一段代码
            await tcs.Task;

        });

        return reslt;
        
    }

到了这里,关于Unity C# 之 Task、async和 await 结合使用的一些情况处理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Winform中使用HttpClient(设置最大超时响应时间)调用接口并做业务处理时界面卡住,使用async Task await异步任务编程优化

    Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类: Winform中怎样使用HttpClient调用http的get和post接口并将接口返回json数据解析为实体类_winform请求http接口_霸道流氓气质的博客-CSDN博客 参考前面使用HttpClient调用http的get和post接口的小示例, 需要定

    2024年02月02日
    浏览(56)
  • Unity 中的 async/await:优雅处理异步任务与协程

    内容将会持续更新,有错误的地方欢迎指正,谢谢!   Unity 中的 async/await:优雅处理异步任务与协程Coroutine       TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取! 助力快速掌握 async/await 异步等待 为初

    2024年02月06日
    浏览(51)
  • C#中await /async 的使用场景,优点,使用方法介绍

      async/await  是 C# 中异步编程的关键特性,它使得异步代码编写更为简单和直观。下面深入详细描述了  async/await  的使用场景、优点以及一些高级使用方法,并提供了相应的实例源代码。 I/O 操作:  异步编程特别适用于涉及 I/O 操作(如文件读写、网络请求等)的场景。在

    2024年02月05日
    浏览(57)
  • 【C#】async和await 续

    在文章《async和await》中,我们观察到了一下客观的规律,但是没有讲到本质,而且还遗留了一个问题: 这篇文章中,我们继续看看这个问题如何解决! 我们再看看之前写的代码: 当时问题是,为啥 Task.Factory.StartNew 可以看到异步效果,而Task.Run中却是同步效果。 那其实是因为

    2024年02月15日
    浏览(41)
  • async/await 与console(C#)

    上一篇async/await 致WPF卡死问题(https://www.cnblogs.com/stephen2023/p/17725159.html),介绍主线程阻塞,async/await导致卡死问题,同样的代码在console下却并不会出现卡死。 并且await后的任务也是由“新线程”执行的,并非主线程执行。 对于如下含await的代码 可以类比于: WPF与Console不同

    2024年02月08日
    浏览(58)
  • 什么是Promise对象?它的状态有哪些?如何使用Promise处理异步操作?以及 async、await

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月11日
    浏览(46)
  • C#异步方法async/await的三种返回类型

    有群友问C#异步方法async返回值Task和void的区别?看似简单,但不容易把它们用好。在C#中的异步编程已经成为现代编程的标配,异步方法(async/await)是实现异步编程的一种常用方式。在异步方法中,可以使用 Task 或 void 作为返回类型,还可以使用ValueTask返回类型。本文将介绍

    2024年02月04日
    浏览(49)
  • async/await 在 C# 语言中是如何工作的?(下)

    接《async/await 在 C# 语言中是如何工作的?(上)》、《async/await 在 C# 语言中是如何工作的?(中)》,今天我们继续介绍 SynchronizationContext 和 ConfigureAwait。   ▌SynchronizationContext 和 ConfigureAwait 我们之前在 EAP 模式的上下文中讨论过 SynchronizationContext,并提到它将再次出现。

    2024年02月08日
    浏览(50)
  • 深入探讨 C# 和 .NET 中 async/await 的历史、背后的设计决策和实现细节

    对 async/await 的支持已经存在了十多年。它的出现,改变了为 .NET 编写可伸缩代码的方式,你在不了解幕后的情况下也可以非常普遍地使用该功能。 从如下所示的同步方法开始(此方法是“ 同步的 ”,因为在整个操作完成并将控制权返回给调用方之前,调用方将无法执行任何

    2024年02月08日
    浏览(42)
  • async和await的的基本使用

    说明: await’ expressions are only allowed within async functions and at the top levels of modules.ts(1308)

    2024年02月13日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包