System.Threading.Tasks - >延续

时间:2012-10-16 21:59:57

标签: c# .net task task-parallel-library

假设你有这项服务:

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所以没有await / async允许 - 这段代码必须在MonoTouch / Mono for Android上运行所以坚持4.0

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

1 个答案:

答案 0 :(得分:3)

我认为您可能正在寻找的是来自Unwrap

System.Threading.Tasks.TaskExtensions方法
myService.Thing1()
.ContinueWith(_ => myService.Thing2()).Unwrap()
.ContinueOnUIThread(_ => label.Text = "Done!");