4

假设您有以下服务:

interface ISuessService {
    Task<Thing> Thing1();
    Task<Thing> Thing2(); 
}

而且我有一个扩展方法ContinueOnUIThread,我可以在其中做一些很酷的事情,比如:

myService.Thing1().ContinueOnUIThread(_ => label.Text = "Done!");

并轻松地与 UI 线程交互。

实现执行此操作的新ContinueWith扩展方法的最佳方法是什么:

myService.Thing1()
  .ContinueWith(myService.Thing2())
  .ContinueOnUIThread(_ => label.Text = "Done!");

基本上在完成Thing2后开始Thing1,然后调用 UI 线程。

我最接近的是这样的,但我真的不喜欢打电话Wait

myService.Thing1()
  .ContinueWith(_ => { 
     var thing2 = myService.Thing2().Wait(); 
     return thing2.Result; 
   })
  .ContinueOnUIThread(_ => label.Text = "Done!");

有没有一种干净的方法可以做到这一点?

PS - 我没有 .Net 4.5,所以不允许等待/异步 - 此代码必须在 MonoTouch/Mono for Android 上运行,所以坚持使用 4.0

PS - 注意我的使用_,这只是“我没有真正使用这个参数”的快捷方式

4

1 回答 1

3

我认为您可能正在寻找的是来自System.Threading.Tasks.TaskExtensions的Unwrap方法

myService.Thing1()
.ContinueWith(_ => myService.Thing2()).Unwrap()
.ContinueOnUIThread(_ => label.Text = "Done!");
于 2012-10-16T22:06:36.777 回答