Where did GetAwaiter go?

How does async work in WinRT?

During this week's Build conference, Microsoft unveils the new Windows and many of its features, using the new WinRT. During Aleš Holeček's talk, selecting a file from C# using the new library was shown. The interesting part is that it was asynchronous and used the new C# 5 async/await.

So, I started preview Visual Studio 11 from preview Windows 8 running as a virtual machine in VirtualBox (which took some figuring out to set up properly) and went to try it by myself. The code looks like this:

var picker = new OpenFilePicker();
var file = await picker.PickSingleFileAsync();

If you read something about await, you know that what it actually does is to call the GetAwaiter() method (which can be an extension method) on the result of the expression it's used on. In this case, it's the result of PickSingleFileAsync(), which is a PickSingleFileOperation. This class implements the IAsyncOperation interface, but doesn't seem to have any GetAwaiter(). So, it has to be an extension method, right? Except extension methods should show up in IntelliSense, which this one doesn't.

To solve this, I looked at the generated code in Reflector. Now, inside the state machine, there is a call to WindowsRuntimeSystemExtensions.GetAwaiter(). So it is an extension method after all? How come I didn't see it? Turns out, that method has an [EditorBrowsable(EditorBrowsable.Never)] attribute on it. What that means is that doesn't show up in Visual Studio, but can still be called.

Thus ends the mystery of the missing GetAwaiter(). C# 5's async/await wasn't revamped because of Windows 8, as I initially suspected. It's just that WinRT hides some complexities that should be hidden to ordinary developers anyway.

c# winrt async
Posted by: Petr Onderka
Last revised: 26 Jul, 2014 03:09 PM History

Discussion

Your Comments

Used for your gravatar. Not required. Will not be public.
Posting code? Indent it by four spaces to make it look nice. Learn more about Markdown.

Preview