当前位置: 首页 > 编程语言 > C#

在C#7中,如何“滚动我自己的”类似任务的类型来处理异步?

时间:2023-04-11 02:06:18 C#

在C#7中,我如何“滚动我自己的”类似任务的类型来处理异步?C#7中一个鲜为人知的特性是“通用异步返回类型”,Microsoft将其描述为:从异步方法返回任务对象会在某些路径中引入性能瓶颈。Task是一个引用类型,所以使用它意味着分配一个对象。如果使用async修饰符声明的方法返回缓存结果或同步完成,则额外分配可能会成为性能关键代码部分的重要时间成本。如果这些分配发生在紧密的循环中,它会变得非常昂贵。新的语言功能意味着异步方法可以返回Task、Task和void以外的类型。返回的类型仍必须满足异步模式,这意味着GetAwaiter方法必须可访问。作为一个具体的例子,ValueTask类型被添加到.NET框架中以使用这个新的语言特性:这听起来不错,但我终其一生都找不到任何不使用普通ValueTask类型的ValueTask。我想做一个类似于我自己的任务类型。具体来说,我想要一个行为类似于任务但具有更多功能的错误处理。这是我在项目中用于函数错误处理的类型:publicclassTry{publicTData{get;}公共异常错误{得到;}publicboolHasData=>错误==null;publicboolHasError=>错误!=null;公共尝试(T数据){数据=数据;}publicTry(Exceptionerror){Error=error;这是我认为我的自定义等待类型应该是这样的:我们应该没问题}这一切都会编译,直到我尝试将它用作异步返回类型:asyncTryTaskDoWhatever(){returnawaitnewTryTask(()=>newTry(1));}这个方法会给出一个编译器错误。异步方法的返回类型必须为void、Task或Task。我该怎么做或类似于编译的东西?更新:只是为了确认,我使用的是3/7版本的VS2017,我可以在我的项目中使用其他C#7功能,例如本机功能。我也尝试使用ValueTask并得到相同的编译器错误。staticasyncValueTaskDoWhatever(){returnawaitnewValueTask(1);这是另一篇介绍新内容的文章。如何在VS2017RC中使用新的异步语义?显然,需要定义一个单独的“方法构建器”类型,并且需要将特殊属性应用于await类型。我不知道我是否真的有时间深入研究这个问题。它看起来更像是元编程黑客而不是“语言功能”。我再也找不到任何好的教程了。但是您可以查看创建类似任务类型的编译器单元测试(查找“[AsyncMethodBuilder”)。起点是创建一个类型并将其标记为具有[AsyncMethodBuilder(typeof(MyTaskBuilder))]等属性的任务。然后你需要定义你自己的MyTaskBuilder类型。它必须实现某种模式(见下文)。这与支持常规任务的常规AsyncMethodBuilder类型实现的模式相同。类MyTaskBuilder{publicstaticMyTaskBuilderCreate()=>null;publicvoidStart(refTStateMachinestateMachine)其中TStateMachine:IAsyncStateMachine{}publicvoidSetStateMachine(IAsyncStateMachinestateMachine){}publicvoidSetResult(){}Setpceptionpublicvoid({}publicMyTaskTask=>default(MyTask);publicvoidAwaitOnCompleted(refTAwaiterawaiter,refTStateMachinestateMachine)whereTAwaiter:INotifyCompletionwhereTStateMachine:IAsyncStateMachine{}publicvoidAwaitUnsafeOnCompleted(refTAwaiterawaiter,refTStateMachinestateMachine)whereTAwaiter:ICriticalNotifyCompletionwhereTStateMachine:IAsyncStateMachine{}}更新:为类似任务添加了一个小规范类型到编译器文档。对于后代,Dixin的博客有一个很好的例子。https://weblogs.asp.net/dixin/functional-csharp-asynchronous-functionDixin的博客是一个宝库。此外,这是一个真实的实现示例:https://github.com/nessos/Eff/blob/master/src/Eff.Core/Eff.cshttps://github.com/nessos/Eff/blob/master/src/Eff.Core/EffMethodBuilder.cs以上是C#学习教程:在C#7中,如何“滚动自己的”类任务类型来处理异步?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: