Async/AwaitLambdas我在结合async/await使其工作时遇到了一个奇怪的问题:我创建了一个小程序,它基本上应该处理每个操作的try/catch:internalstaticvoidHandledAction(Actionaction,Info信息栏){try{action();}catch(Exceptionex){infoBar.SetError("发生异常:"+ex.Message);写入日志(例如StackTrace);它看起来很花哨,但它很有价值,因为更改错误处理非常容易。但是如果我想在Lambda中异步获取数据会怎样?让我们举一个简单的例子:}当然调用了HandledAction,Passed,既然返回指针,抛出异常当然不处理。我想我必须创建一个AsyncHandledAction,并将操作设置为异步,但是有没有更简单的方法来解决这个问题?我猜很多人都使用中央异常处理,有没有更好的解决方案?提前致谢Matthias编辑:我创建了一个示例,它应该shpwnetter我需要什么:我基本上不希望我传递的整个Action是可等待的,但是在Lambda中调用:ActionHelper.HandledActionAsync(()=>{//省略了CheckFileResultrslt=awaitexcelImport.CheckFilesAsync(tmpPath);//省略了},infoMain);当然,通过这样做,我得到了错误:Error3The'await'operatorcanonlybeusedinanasynchronouslambdaexpression。考虑使用“async”修饰符标记此lambda表达式。您需要HandleAction的异步版本internalstaticasyncTaskHandledAction(Funcaction,InfoinfoBar){try{awaitaction();}catch(Exceptionex){infoBar.SetError("发生异常:"+ex.Message);WriteLog(例如StackTrace);}}当然你应该用awaitprivateasyncvoidmnuImportData_Click(objectsender,RoutedEventArgse){awaitActionHelper.HandledAction(async()=>{thrownewNotImplementedException("Ups");},infoMain)调用方法原因是:Action而不是Func。因为你的:async()=>{thrownewNotImplementedException("Ups");}实际上是:asyncvoidMethod(){}当Func是:asyncTaskMethod(){}asyncvoid会捕获SynchronizationContext.Current,当抛出异常时,会通过SynchronizationContext.Post()发布到SynchronizationContext——(在Windows运行时,您可以捕获这些类型的异常)。在ASP.NET/Console应用程序案例中,SynchronizationContext.Current返回null,这意味着异常将传播到线程池,我不确定,但我认为不可能捕获它。但是当异步方法返回一个Task时,异常可以通过返回的Task封送到调用者。还值得一提的是,异步lambda表达式总是优于Func而不是Action。一般规则是:永远不要使用asyncvoid(asyncAction),除非它是“顶级方法”(在示例事件处理程序中)。以上就是C#学习教程:Async/AwaitLambdas分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
