如何从非异步方法调用异步方法?我有以下方法:publicstringRetrieveHolidayDatesFromSource(){varresult=this.RetrieveHolidayDatesFromSourceAsync();/**做一些事情**/varreturnedResult=this.TransformResults(result.Result);/**result被使用的地方**/returnreturnedResult;}privateasyncTaskRetrieveHolidayDatesFromSourceAsync(){使用(varhttpClient=newHttpClient()){varjson=awaithttpClient.GetStringAsync(SourceURI);返回json;我不知道我在哪里缺少强制等待结果的声明?我希望RetrieveHolidayDatesFromSource()方法返回一个字符串。以下工作正常,但它是同步的,我相信它可以改进?请注意,下面是同步的,我想将其更改为异步的,但由于某些原因并没有解决问题。公共字符串RetrieveHolidayDatesFromSource(){varresult=this.RetrieveHolidayDatesFromSourceAsync();/**做一些事情**/varreturnedResult=this.TransformResults(result);/**这里才是真正使用Result的地方**/returnreturnedResult;}privatestringRetrieveHolidayDatesFromSourceAsync(){使用(varhttpClient=newHttpClient()){varjson=httpClient.GetStringAsync(SourceURI);返回json.Result;我错过了什么吗?注意:出于某种原因,当我打破上面的异步方法时,当它到达“varjson=awaithttpClient.GetStringAsync(SourceURI)”行时,它超出了断点,我无法返回到该方法。我错过了什么吗?是的。异步代码-本质上-意味着在操作进行时不使用当前线程。同步代码-就其本质而言-意味着当前线程在操作进行时被阻塞。这就是为什么从同步代码调用异步代码甚至没有意义。事实上,一种天真的方法(使用结果/等待)很容易导致死锁,正如我在我的博客中所描述的那样。首先要考虑的是:我的API应该是同步的还是异步的?如果它处理I/O(如本例所示),它应该是异步的。因此,这将是一个更合适的设计:publicasyncTaskRetrieveHolidayDatesFromSourceAsync(){/**做一些事情**/varreturnedResult=this.TransformResults(result);/**result被使用的地方**/returnreturnedResult;正如我在我的异步最佳实践文章中所描述的,您应该“始终是异步的”。如果不这样做,那么无论如何您都不会从异步中获得任何好处,那么何必呢?但是假设您最终会对异步感兴趣,但现在您无法更改所有内容,您只想更改应用程序的一部分。这是一种很常见的情况。在这种情况下,正确的做法是同时公开同步和异步API。最终,在升级所有其他代码后,可以删除同步API。我在关于棕色异步开发的文章中探讨了这种情况的各种选择;我个人最喜欢的是“boolparameterhack”,它看起来像这样:}publicTaskRetrieveHolidayDatesFromSourceAsync(){returnthis.DoRetrieveHolidayDatesFromSourceAsync(sync:false);}privateasyncTaskDoRetrieveHolidayDatesFromSourceAsync(boolsync){varresult=awaitthis.GetHolidayDatesAsync(sync);/**做一些事情**/varreturnedResult=this.TransformResults(result);返回返回结果;}privateasyncTaskGetHolidayDatesAsync(boolsync){使用(varclient=newWebClient()){返回同步?client.DownloadString(SourceURI):awaitclient.DownloadStringTaskAsync(SourceURI);这种方法避免了代码重复,也避免了与其他“同步异步”反模式解决方案相同的死锁或重入问题。请注意,我仍会将生成的代码视为通向适当的异步API路径上的“中间步骤”。特别是,内部代码必须依赖WebClient(同时支持同步和异步),而不是首选的HttpClient(仅支持异步)。将所有调用代码更改为使用RetrieveHolidayDatesFromSourceAsync而不是RetrieveHolidayDatesFromSource后,我将重新访问并删除所有技术债务,将其更改为使用HttpClient并仅异步。公共字符串RetrieveHolidayDatesFromSource(){varresult=this.RetrieveHolidayDatesFromSourceAsync().Result;/**做一些事情**/varreturnedResult=this.TransformResults(result.Result);/**result被使用的地方**/returnreturnedResult;如果将.Result添加到异步调用中,它将执行并等待结果到达,强制其同步更新:privatestaticstringstringTest(){returngetStringAsync().Result;}privatestaticasyncTaskgetStringAsync(){返回等待任务。FromResult("你好");}staticvoidMain(string[]args){Console.WriteLine(stringTest());解决评论:这没有错。以上就是C#学习教程:如何从非异步方法中调用异步方法?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
