How would you implement something that works similarly to the Async CTP await
keyword? Is there a simple implementation that works like await
in all cases, or does await
require different implementations for different scenarios?
await
always involves the same kind of transformation - but it's a pretty painful one. The library side of await
isn't too complicated, but the tricky bit is that the compiler builds a state machine for you, allowing the continuation to jump back to the right place.
It's possible that my some hacky use of iterator blocks (yield return) you could fake something similar... but it would be pretty ugly.
I gave a DevExpress webinar on what the compiler is doing behind the scenes a few weeks ago - that shows decompiled code from a couple of examples, as well as explaining how the compiler builds a task to return, and what the "awaiter" has to do. It may be useful to you.