赞
踩
利用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()来异步执行函数就行。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。