贸易公司网站建设价格,网站设计与制作优点,宁波公司建设网站,定期更新网站本来这章该讲的是 ASP .NET Core 中的 IIS 和 Kestrel #xff0c;但是我看了下这个是给服务器用的。而我只是个 Unity 客户端程序#xff0c;对于服务器的了解趋近于零。 鉴于我对服务器知识和需求的匮乏#xff0c;这里就不讲原书#xff08;大部分#xff09;内容了。本… 本来这章该讲的是 ASP .NET Core 中的 IIS 和 Kestrel 但是我看了下这个是给服务器用的。而我只是个 Unity 客户端程序对于服务器的了解趋近于零。 鉴于我对服务器知识和需求的匮乏这里就不讲原书大部分内容了。本章节里面有一部分还是客户端也可以学习的就是异步流。所以这个章节就改为只学习异步流即可。 本教程学习工程魔术师Dix / HandsOnParallelProgramming · GitCode 1、异步流简介 .Net Core 3.0 还引入了异步流Asynchronous Stream支持。
异步返回类型 | Microsoft Learn了解在 C# 中异步方法可以具有的返回类型以及每种类型的代码示例。https://learn.microsoft.com/zh-cn/dotnet/csharp/asynchronous-programming/async-return-types 这项新功能可以使开发人员等待 IAsyncEnumerableT 上的 foreach 循环以使用流中的元素并使用 yield 返回流以生成元素。异步流不但支持海量数据而且可使服务器在同一时间通过有效地利用线程来做出响应。 2、语法介绍 按照本章节的说法我们这里使用两个接口IAsyncEnumerableT 和 IAsyncEnumeratorT。对于接口的实现比较好说直接看代码 public class MyAsyncEnumerable : IAsyncEnumerableint{private MyAsyncEnumerator mAsyncEnumerator;public IAsyncEnumeratorint GetAsyncEnumerator(CancellationToken cancellationToken default){if (mAsyncEnumerator null)mAsyncEnumerator new MyAsyncEnumerator();return mAsyncEnumerator;}}public class MyAsyncEnumerator : IAsyncEnumeratorint{private int m_Value;public async ValueTaskbool MoveNextAsync(){m_Value;await Task.Delay(1000);if (m_Value 10)return true;elsereturn false;}public int Current m_Value;public ValueTask DisposeAsync(){m_Value 0;return new ValueTask(Task.CompletedTask);}} 这里我们看到每次执行 MoveNext 的时候就会等待 1s 这里是模拟某个非常耗时的函数之后再继续执行直到返回 false这里当然是和普通迭代器模式是一样的。 3、测试用例 下面我们来测试一下直接在主线程调用运行以下函数 public static async void TestRunWithAsyncStream(){Debug.Log(TestRunWithAsyncStream Start !);MyAsyncEnumerable myEnumerable new MyAsyncEnumerable();await foreach (var item in myEnumerable){Debug.Log(${Task.CurrentId} {item}); }Debug.Log(TestRunWithAsyncStream End !);} 运行结果如下 可见运行过程中并没有阻塞主线程而是在异步执行了MoveNext将值返回到当前循环体中。由于方法体是在主线程执行的所以还可以这么写 public static async void TestRunWithAsyncStream(){Debug.Log(TestRunWithAsyncStream Start !);MyAsyncEnumerable myEnumerable new MyAsyncEnumerable();await foreach (var item in myEnumerable){Debug.Log(${Task.CurrentId} {item});//创建一个Objvar go GameObject.CreatePrimitive(PrimitiveType.Cube);go.name $OBJ_{item};}Debug.Log(TestRunWithAsyncStream End !);} 从运行结果上看 异步创建了 GameObject这里就很方便地看到异步和主线程结合在一起了在使用上并看不到任何差异。 4、总结 异步流用起来很简单写起来稍微复杂一些。 在数据量不多的时候我们通常是将所有的异步操作例如读文件完成之后再在主线程执行一些 Unity 的操作。当然在一般情况下是没问题的一般来讲数据都不大不存在问题。但是如果是所谓的海量数据读文件占用的时间就足够大而主线程等待时间过长又没有反应就不是很友好。这种情况下就可以使用异步流来处理执行一段异步程序处理、马上就执行主线程处理。 而且使用异步流能保证执行顺序相应地并行度就只为1比较适合某些流程性质的重逻辑。 本教程学习工程魔术师Dix / HandsOnParallelProgramming · GitCode