Unity异步编程

本文深入探讨了C#中的异步编程技巧,利用await/async语法糖简化异步操作,详细介绍了Task类及其在异步模式中的核心作用。通过具体示例,展示了如何使用Task.Run方法启动异步任务,并通过Wait方法同步执行流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用C# await/async 语法糖简单实现一下异步编程,其本质是利用C# 创建的线程池来异步执行 指定的操作。
定义如下:

Task 类表示通常以异步方式执行的单个操作, Task 对象是基于任务的异步模式的中心组件之一。 由于 Task 对象执行的工作通常在线程池线程上异步执行,而不是在主应用程序线程上同步执行,因此可以使用 Status 属性,还可以使用 IsCanceled、IsCompleted和 IsFaulted 属性,用于确定任务的状态。 通常,lambda 表达式用于指定任务要执行的工作。可以通过多种方式创建 Task 实例。 最常见的方法(从 .NET Framework 4.5开始提供)是调用静态 Run 方法。 Run 方法提供一种简单的方法来使用默认值启动任务,而无需其他参数。Task 类还提供了初始化任务的构造函数,但不计划执行该任务。 出于性能原因,Task.Run 或 TaskFactory.StartNew 方法是用于创建和计划计算任务的首选机制,但对于必须分隔创建和计划的情况,可以使用构造函数,然后调用 Task.Start用于计划任务稍后执行的方法。因为任务通常在线程池线程上以异步方式运行,所以,创建和启动任务的线程会在实例化任务后立即继续执行。 在某些情况下,当调用线程是主应用程序线程时,应用程序可能会在任何任务实际开始执行之前终止。 在其他情况下,应用程序的逻辑可能要求调用线程在一个或多个任务完成执行时继续执行。 可以通过调用 Wait 方法来等待一个或多个任务完成,从而同步调用线程的执行以及它启动的异步任务。若要等待单个任务完成,可以调用其 Task.Wait 方法。 Wait(Int32) 和 Wait(TimeSpan) 方法会阻止调用线程,直到任务完成或超时间隔结束。

public class LoadManager{
   public class userdata
    {
        public int id { get; set; }
        public string username
        {
            get
            {
                return string.Format("{0}{1}", "id=", id.ToString());
            }
        }
    }


    public void LoadAsset()
    {
        int i = 1;
        while (i < 100)
        {
            LoadingFileAsync(i, (a) =>
            {
                Debug.Log(a * 2);
            });
            i++;
        }

        while (i < 200)
        {
            userdata user = new userdata() { id = i };

            LoadingFileAsync(user, (a) =>
            {
                Debug.Log(a.username);
            });
            i++;
        }
    }


    public async void LoadingFileAsync(int i, Action<int> completeAction)
    {
        await Task.Run(() =>
        {
            Thread.Sleep(300);

            if (completeAction != null)
            {
                completeAction(i);
            }
        });
    }

    public async void LoadingFileAsync(userdata i, Action<userdata> completeAction)
    {
        await Task.Run(() =>
        {
            Thread.Sleep(300);

            if (completeAction != null)
            {
                i.id += 1000;
                completeAction(i);
            }
        });
    }
}

使用的时候按照上述写法,通过 await Task.Run()来异步执行函数就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值