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

Task如何转换为Task?分享

时间:2023-04-10 19:56:45 C#

Task如何转换为Task?由于C#的Task是一个类,您显然不能将Task转换为Task。但是,您可以这样做:publicasyncTaskRun(){returnawaitMethodThatReturnsDerivedTask();有没有我可以调用的静态任务方法来获取一个Task实例,它基本上只指向底层任务并转换结果?我喜欢这样的东西:publicTaskRun(){returnTask.FromDerived(MethodThatReturnsDerivedTask());这种方法存在吗?仅出于此目的使用异步方法是否有任何开销?这样的方法存在吗?不会。为此目的使用异步方法是否有任何开销?是的。但这是最简单的解决方案。注意,更通用的方法是Task的扩展方法,比如Then。StephenToub在一篇博文中对此进行了探讨,我最近将其集成到了AsyncEx中。使用Then,您的代码将如下所示:publicTaskRun(){returnMethodThatReturnsDerivedTask().Then(x=>(TBase)x);另一种开销略小的方法是创建您自己的TaskCompletionSource并使用派生的Result完成它(使用我的AsyncEx库中的TryCompleteFromCompletedTask):MethodThatReturnsDerivedTask().ContinueWith(t=>tcs.TryCompleteFromCompletedTask(t),TaskContinuationOptions.Execute;Synchronously)tcs.Task;}或(如果您不想依赖AsyncEx):publicTaskRun(){vartcs=newTaskCompletionSource();MethodThatReturnsDerivedTask().ContinueWith(t=>{if(t.IsFaulted)tcs.TrySetException(t.Exception.InnerExceptions);elseif(t.IsCanceled)tcs.TrySetCanceled();elsetcs.TrySetResult(t.Result);}},TaskContinuationOptions.ExecuteSynchronously);返回tcs.Task;这种方法存在吗?仅出于此目的使用异步方法是否有任何开销?没有为此的内置方法,这确实会导致开销。“最轻量级”的替代方法是使用TaskCompletionSource为此创建一个新任务。这可以通过如下扩展方法完成:staticTaskFromDerived(thisTasktask)whereTDerived:TBase{vartcs=newTaskCompletionSource();task.ContinueWith(t=>tcs.SetResult(t.Result),TaskContinuationOptions.OnlyOnRanToCompletion);task.ContinueWith(t=>tcs.SetException(t.Exception.InnerExceptions),TaskContinuationOptions.OnlyOnFaulted);task.ContinueWith(t=>tcs.SetCanceled(),TaskContinuationOptions.OnlyOnCanceled);返回tcs.Task;你可以试试这个:task.ContinueWith(t=>(TDerived)t.Result);以上就是C#学习教程:HowtoconvertTasktoTask?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: