c# – 对任务完成做出反应:`.ContinueWith()`vs`GetAwaiter().O
假设我有一个生成int的
Task ,以及一个接受int的回调:
Task<int> task = ...; Action<int> f = ...; 现在我想设置它,以便一旦任务完成并返回其整数结果,将使用该整数调用callfack f – 无需主线程等待任务完成: >据我了解,典型的解决方案是 task.ContinueWith(t => f(t.Result)); >但是,也可以为任务获取 TaskAwaiter<int> awaiter = task.GetAwaiter(); awaiter.OnCompleted(() => f(awaiter.GetResult())); 现在,我意识到TaskAwaiter并不打算在应用程序代码中常用,主要存在于await关键字内部使用. 解决方案(1)和(2)之间是否有任何实际区别? 例如, > …关于在哪个线程上调用回调? 解决方法
一个区别是
task.ContinueWith(t => f(t.Result)); 不会捕获当前的同步上下文,例如,在UI应用程序中 – 将在线程池线程上执行回调.而 TaskAwaiter<int> awaiter = task.GetAwaiter(); awaiter.OnCompleted(() => f(awaiter.GetResult())); 将捕获同步上下文,并将在UI线程上执行回调. 当然你可以用ContinueWith做同样的事情: task.ContinueWith(r => f(r.Result),TaskScheduler.FromCurrentSynchronizationContext()); 但那并不是你所使用的问题.所以问题中提供的方式至少在这方面是不同的. 异常表示也有区别,如果任务出现故障,则访问Task.Result将抛出AggregateException(有一个或多个异常作为内部异常),而访问awaiter.GetResult()不会在AggregateException中包装抛出的异常并将其重新抛出为是(并且如果有多个异常,例如来自Task.WhenAll – 除了一个之外的所有异常将被忽略并且只会抛出一个). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- iOS8 / iPhone6 XPC崩溃
- SWFUpload多文件上传 文件个数限制 setStats()
- XML文件转换成 HTML
- c# – 如何将ServiceStack客户端与Xamarin.Android Indie许
- c# – 枚举Dictionary.Values vs Dictionary本身
- (1.1.13)正则表达式30分钟入门
- ruby-on-rails – Rails Capybara-webkit – javascript代码
- Oracle连接查询
- ruby-on-rails – 使用selenium驱动程序时authlogic不能与c
- [cocos2dx]cocos2dx-lua中的框架MVC