Understanding C# async / await (2) Awaitable / Awaiter Pattern

What is awaitable

Part 1 shows that any Task is awaitable. Actually there are other awaitable types. Here is an example:

Task<int> task = new Task<int>(() => 0);
int result = await task.ConfigureAwait(false); // Returns a ConfiguredTaskAwaitable<TResult>.

The returned ConfiguredTaskAwaitable<TResult> struct is awaitable. And it is not Task at all:

public struct ConfiguredTaskAwaitable<TResult>
{
    private readonly ConfiguredTaskAwaiter m_configuredTaskAwaiter;

    internal ConfiguredTaskAwaitable(Task<TResult> task, bool continueOnCapturedContext)
    {
        this.m_configuredTaskAwaiter = new ConfiguredTaskAwaiter(task, continueOnCapturedContext);
    }

    public ConfiguredTaskAwaiter GetAwaiter()
    {
        return this.m_configuredTaskAwaiter;
    }
}

It has one GetAwaiter() method. Actually in part 1 we have seen that Task has GetAwaiter() method too:

public class Task
{
    public TaskAwaiter GetAwaiter()
    {
        return new TaskAwaiter(this);
    }
}

public class Task<TResult> : Task
{
    public new TaskAwaiter<TResult> GetAwaiter()
    {
        return new TaskAwaiter<TResult>(this);
    }
}

Task.Yield() is a another example:

await Task.Yield(); // Returns a YieldAwaitable.

The returned YieldAwaitable is not Task either:

public struct YieldAwaitable
{
    public YieldAwaiter GetAwaiter()
    {
        return default(YieldAwaiter);
    }
}

Again, it just has one GetAwaiter() method. In this article, we will look at what is awaitable.

The awaitable / awaiter pattern

By observing different awaitable / awaiter types, we can tell that an object is awaitable if

  • It has a GetAwaiter() method (instance method or extension method);
  • Its GetAwaiter() method returns an awaiter. An object is an awaiter if:
    • It implements INotifyCompletion or ICriticalNotifyCompletion interface;
    • It has an IsCompleted, which has a getter and returns a Boolean;
    • it has a GetResult() method, which returns void, or a result.

This awaitable / awaiter pattern is very similar to the iteratable / iterator pattern. Here is the interface definitions of iteratable / iterator:

public interface IEnumerable
{
    IEnumerator GetEnumerator();
}

public interface IEnumerator
{
    object Current { get; }

    bool MoveNext();

    void Reset();
}

public interface IEnumerable<out T> : IEnumerable
{
    IEnumerator<T> GetEnumerator();
}

public interface IEnumerator<out T> : IDisposable, IEnumerator
{
    T Current { get; }
}

In case you are not familiar with the out keyword, please find out the explanation in Understanding C# Covariance And Contravariance (2) Interfaces.

The “missing” IAwaitable / IAwaiter interfaces

Similar to IEnumerable and IEnumerator interfaces, awaitable / awaiter can be visualized by IAwaitable / IAwaiter interfaces too. This is the non-generic version:

public interface IAwaitable
{
    IAwaiter GetAwaiter();
}

public interface IAwaiter : INotifyCompletion // or ICriticalNotifyCompletion
{
    // INotifyCompletion has one method: void OnCompleted(Action continuation);

    // ICriticalNotifyCompletion implements INotifyCompletion,
    // also has this method: void UnsafeOnCompleted(Action continuation);

    bool IsCompleted { get; }

    void GetResult();
}

Please notice GetResult() returns void here. Task.GetAwaiter() / TaskAwaiter.GetResult() is of such case.

And this is the generic version:

public interface IAwaitable<out TResult>
{
    IAwaiter<TResult> GetAwaiter();
}

public interface IAwaiter<out TResult> : INotifyCompletion // or ICriticalNotifyCompletion
{
    bool IsCompleted { get; }

    TResult GetResult();
}

Here the only difference is, GetResult() return a result. Task<TResult>.GetAwaiter() / TaskAwaiter<TResult>.GetResult() is of this case.

Please notice .NET does not define these IAwaitable / IAwaiter interfaces at all. As an UI designer, I guess the reason is, IAwaitable interface will constraint GetAwaiter() to be instance method. Actually C# supports both GetAwaiter() instance method and GetAwaiter() extension method.

Here I use these interfaces only for better visualizing what is awaitable / awaiter. Now, if looking at above ConfiguredTaskAwaitable / ConfiguredTaskAwaiter, YieldAwaitable / YieldAwaiter, Task / TaskAwaiter pairs again, they all “implicitly” implement these “missing” IAwaitable / IAwaiter interfaces. In the next part, we will see how to implement awaitable / awaiter.

Await any function / action

In C# await cannot be used with lambda. This code:

int result = await (() => 0);

will cause a compiler error:

Cannot await 'lambda expression'

This is easy to understand because this lambda expression (() => 0) may be a function or a expression tree. Obviously we mean function here, and we can tell compiler in this way:

int result = await new Func<int>(() => 0);

It causes an different error:

Cannot await 'System.Func<int>'

OK, now the compiler is complaining the type instead of syntax. With the understanding of the awaitable / awaiter pattern, Func<TResult> type can be easily made into awaitable.

GetAwaiter() instance method, using IAwaitable / IAwaiter interfaces

First, similar to above ConfiguredTaskAwaitable<TResult>, a FuncAwaitable<TResult> can be implemented to wrap Func<TResult>:

internal struct FuncAwaitable<TResult> : IAwaitable<TResult>
{
    private readonly Func<TResult> function;

    public FuncAwaitable(Func<TResult> function)
    {
        this.function = function;
    }

    public IAwaiter<TResult> GetAwaiter()
    {
        return new FuncAwaiter<TResult>(this.function);
    }
}

FuncAwaitable<TResult> wrapper is used to implement IAwaitable<TResult>, so it has one instance method, GetAwaiter(), which returns a IAwaiter<TResult>, which wraps that Func<TResult> too. FuncAwaiter<TResult> is used to implement IAwaiter<TResult>:

public struct FuncAwaiter<TResult> : IAwaiter<TResult>
{
    private readonly Task<TResult> task;

    public FuncAwaiter(Func<TResult> function)
    {
        this.task = new Task<TResult>(function);
        this.task.Start();
    }

    bool IAwaiter<TResult>.IsCompleted
    {
        get
        {
            return this.task.IsCompleted;
        }
    }

    TResult IAwaiter<TResult>.GetResult()
    {
        return this.task.Result;
    }

    void INotifyCompletion.OnCompleted(Action continuation)
    {
        new Task(continuation).Start();
    }
}

Now a function can be awaited in this way:

int result = await new FuncAwaitable<int>(() => 0);

GetAwaiter() extension method

As IAwaitable shows, all that an awaitable needs is just a GetAwaiter() method. In above code, FuncAwaitable<TResult> is created as a wrapper of Func<TResult> and implements IAwaitable<TResult>, so that there is a  GetAwaiter() instance method. If a GetAwaiter() extension method  can be defined for Func<TResult>, then FuncAwaitable<TResult> is no longer needed:

public static class FuncExtensions
{
    public static IAwaiter<TResult> GetAwaiter<TResult>(this Func<TResult> function)
    {
        return new FuncAwaiter<TResult>(function);
    }
}

So a Func<TResult> function can be directly awaited:

int result = await new Func<int>(() => 0);

Using the existing awaitable / awaiter - Task / TaskAwaiter

Remember the most frequently used awaitable / awaiter - Task / TaskAwaiter. With Task / TaskAwaiter, FuncAwaitable / FuncAwaiter are no longer needed:

public static class FuncExtensions
{
    public static TaskAwaiter<TResult> GetAwaiter<TResult>(this Func<TResult> function)
    {
        Task<TResult> task = new Task<TResult>(function);
        task.Start();
        return task.GetAwaiter(); // Returns a TaskAwaiter<TResult>.
    }
}

Similarly, with this extension method:

public static class ActionExtensions
{
    public static TaskAwaiter GetAwaiter(this Action action)
    {
        Task task = new Task(action);
        task.Start();
        return task.GetAwaiter(); // Returns a TaskAwaiter.
    }
}

an action can be awaited as well:

await new Action(() => { });

Now any function / action can be awaited:

await new Action(() => HelperMethods.IO()); // or: await new Action(HelperMethods.IO);

If function / action has parameter(s), closure can be used:

int arg0 = 0;
int arg1 = 1;
int result = await new Action(() => HelperMethods.IO(arg0, arg1));

Using Task.Run()

The above code is used to demonstrate how awaitable / awaiter can be implemented. Because it is a common scenario to await a function / action, so .NET provides a built-in API: Task.Run():

public class Task2
{
    public static Task Run(Action action)
    {
        // The implementation is similar to:
        Task task = new Task(action);
        task.Start();
        return task;
    }

    public static Task<TResult> Run<TResult>(Func<TResult> function)
    {
        // The implementation is similar to:
        Task<TResult> task = new Task<TResult>(function);
        task.Start();
        return task;
    }
}

In reality, this is how we await a function:

int result = await Task.Run(() => HelperMethods.IO(arg0, arg1));

and await a action:

await Task.Run(() => HelperMethods.IO());
Published Thursday, November 08, 2012 12:10 AM by Dixin
Filed under: , , ,

Comments

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, November 09, 2012 11:16 PM by SGWellens

FYI:  Those weird comments you are getting are mostly spammers trying to get links to their sites embedded in your blog so they get higher SEO scores.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Wednesday, March 13, 2013 9:51 PM by insanity workout

mahvrick.tv/.../madness-workout-review-cheap-insanity-workout

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, March 17, 2013 8:48 PM by insanity workout

beegry.com/.../zumba-physical-fitness-video-is

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, March 18, 2013 9:08 PM by zumba dvd

www.jobsmarket.ie/.../Shawn-T-Insanity-Workout-Develops-Muscle-Naturally

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, March 19, 2013 8:58 AM by Isabel Marant

gdtt.net/member.php

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, March 22, 2013 5:26 AM by christian louboutin outlet

clipreactor.ru/.../12866-elegante-de-boutique.html

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, March 24, 2013 10:24 PM by insanity workout

basketballtheremix.com/blog_entry.php

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, March 25, 2013 4:11 AM by insanity

www.bawsindustries.com/index.php

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, March 25, 2013 9:59 PM by christian louboutin uk

groups.diigo.com/.../step_2

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, March 26, 2013 9:31 PM by Isabel Marant

http://gfhfgjkfhn.blog.com/

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Wednesday, March 27, 2013 4:10 AM by insanity workout canada

www.str1.net/.../showthread.php     Result: chosen nickname "Weeriausaks"; captcha recognized; registered (100%); logged in; nofollow is found; success (from first page); (reply to topic);

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Thursday, March 28, 2013 4:02 AM by insanity workout canada

globalstv.com/.../just-what-is-a-zumba-physical-fitness-workout

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 01, 2013 3:54 AM by christian louboutin

tncommunity.info/.../top-5-questions-inquired-about-t

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 01, 2013 6:11 AM by insanity

najaradio.com/index.php

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 01, 2013 6:32 AM by insanity

http://fdgwe4tgdr.webs.com/

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 02, 2013 10:10 PM by insanity workout

www.lokimun.com/.../the-very-best-zumba-dvd-and-how-to-get-it-for-much-less

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Wednesday, April 03, 2013 6:47 AM by insanity

www.lagbook.com/.../how-to-rip-off-at-shaun-ts-insanity

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, April 07, 2013 5:22 AM by Isabel Marant

fashion123123.autisable.com/.../is-the-insanity-workout-effective

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, April 07, 2013 6:14 AM by Steward

Hello! Someone in my Facebook group shared this site with us so I

came to give it a look. I'm definitely loving the information. I'm

bookmarking and will be tweeting this to my followers!

Outstanding blog and outstanding

design and style.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, April 07, 2013 10:56 PM by Whitlock

whoah this blog is fantastic i love reading your articles.

Keep up the

good work! You know, lots of people are looking around for this

information, you could help them greatly.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 08, 2013 1:38 AM by insanity

www.hasenchat.net/.../does-zumba-job-as-an-effective-m

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 08, 2013 2:43 AM by Haight

I am continuously searching online for posts that can assist me.

Thx!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 3:14 AM by insanity

rytuhtr6i546385.blog.com

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 4:46 AM by casquette monster

If you'd like a powerful marketing of your worthy of, consider relations. casquette monster http://www.promolaredoute.fr/

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 4:55 AM by niketnmode.com

If you'd prefer a substantial sales with the really, volume your folks. niketnmode.com http://www.niketnmode.com/

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 5:37 PM by Louis Vuitton Handbags

gohtv.com/.../the-best-ways-to-decide-on-the-appropriate-running-sneakers

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 6:50 PM by Grace

Thanks for sharing excellent informations. Your website is very cool.

I

am impressed by the details that you have on this website.

It reveals how nicely you

perceive this subject. Bookmarked this website page, will come back for more articles.

You, my pal, ROCK! I found just the info I already searched all over the

place

and simply could not come across. What a perfect

web-site.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 8:24 PM by insanity workout

cashflowinnercircle.biz/.../profile.php

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 8:27 PM by Isabel marant sneakers

fationhandbags.sweetcircles.com/.../assessing-the-insanity-exercise-max-period-training-program

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 8:56 PM by zumba

naej.ke0.eu/.../profile.php

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 09, 2013 9:27 PM by zumba dvd

www.thankatroop.com/.../brand-evaluation-of-louis-vuitton-handbags

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Wednesday, April 10, 2013 7:30 AM by Gomes

I’d have to test with you here. Which is not something I usually do!

I get pleasure from reading a put up that can make

people think. Also, thanks for

allowing me to remark!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Wednesday, April 10, 2013 12:52 PM by Webster

certainly like your web site but you have to check the

spelling on quite a few of your posts. Several of them are rife with

spelling issues

and I find it very bothersome to tell the truth nevertheless I’ll certainly come

back again.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Thursday, April 11, 2013 12:01 AM by Workman

When I initially commented I clicked the -Notify me

when new comments are added-

checkbox and now every time a remark is added I get 4 emails with the identical comment.

Is there any method you may take away me

from that service? Thanks!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Thursday, April 11, 2013 4:18 AM by Guthrie

You must participate in a contest for

probably the greatest blogs on the web. I will

recommend this web site!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Thursday, April 11, 2013 3:18 PM by Call

Hi there, i read your blog occasionally and i own a similar one and i was just

curious if you get a lot of spam responses?

If so how do you prevent it, any plugin or anything you

can recommend? I get so much lately it's driving me crazy so any assistance is very much appreciated.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 12:37 AM by Rushing

Somebody essentially assist to make

significantly posts I'd state. That is the first time I

frequented your web page and thus far? I amazed with the

research you made to create this actual submit

amazing. Wonderful task!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 3:12 AM by Cherry

Thanks on your marvelous posting! I

quite enjoyed reading it, you will be a great author.

I will make sure to bookmark your blog and

may come back sometime soon. I want to encourage continue your great work, have a nice morning!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 4:42 AM by Carper

After research a number of of the blog posts on your

web site now, and I truly like your way of blogging.

I

bookmarked it to my bookmark web site checklist and will be

checking back soon. Pls check out my website as nicely and let me

know what you think.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 6:12 AM by Reeves

Would you be involved in exchanging

hyperlinks?

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 8:24 AM by Pedigo

I’m not that much of a internet reader to be honest but your sites really nice,

keep it up! I'll go ahead

and bookmark your site to come back later on. All the best

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 10:43 AM by Frasier

Hi there, just became aware of your blog through Google, and found that it is truly

informative. I’m gonna watch out for brussels.

I’ll be grateful if you continue

this in future. Numerous people will be benefited from your writing.

Cheers!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 11:10 AM by Piper

Hi there, simply turned into alert to your blog

through Google, and located that it's truly informative. I am going to

watch out for brussels. I’ll appreciate in the event you proceed this in future. Many other people shall be benefited from your writing. Cheers!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 12, 2013 6:07 PM by Gould

Hmm is anyone else experiencing problems with the pictures on this blog loading?

I'm trying

to determine if its a problem on my end or if it's the blog.

Any feed-back would be greatly appreciated.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Saturday, April 13, 2013 8:49 AM by Mccallum

I am extremely impressed with your writing talents as smartly as with the format in your

blog. Is this a paid subject matter or did you modify it

your self? Either way stay up the excellent high quality writing, it’s

rare to peer a great blog like this one these days..

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Saturday, April 13, 2013 9:10 AM by Card

A person necessarily assist to make severely articles I might state.

That is the very first time I

frequented your website page and up to now?

I amazed with the

research you made to create this actual publish extraordinary.

Great task!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, April 14, 2013 1:42 AM by Morris

Thanks for ones marvelous posting! I certainly enjoyed reading it, you happen to be a great author.

I will be sure to bookmark your blog and will eventually come back

later in life. I want to encourage that you continue your great writing, have

a nice morning!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, April 14, 2013 11:22 PM by dilxwb@gmail.com

www.nwhelicopters.com/.../profile.php

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 15, 2013 11:07 AM by Sommer

What’s Taking place i'm new to this, I stumbled upon this I have found It

absolutely helpful and it has aided me out loads. I'm hoping to contribute & aid

different users like its helped me. Great

job.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 15, 2013 5:57 PM by Arteaga

I comment whenever I especially enjoy a article on a site or

I have something to contribute to the conversation. Usually it's caused by the passion communicated in the article I looked at. And after this article Understanding C# async / await (2) Awaitable / Awaiter Pattern - Dixin's

Blog. I was actually moved enough to drop a thought :-P I actually do

have some questions for you if you usually do not mind.

Could it be just me or does it give the impression like some of these remarks appear like they

are left by brain dead visitors? :-P And, if you are writing at additional places,

I'd like to keep up with anything new you have to post. Could you make a list every one of your shared pages like your linkedin profile, Facebook page or twitter feed?

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, April 15, 2013 7:47 PM by Mead

I’ll immediately take hold of your rss feed as I

can't to find your e-mail subscription hyperlink or e-newsletter service. Do

you've any? Kindly permit me recognize in

order that I may subscribe. Thanks.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, April 16, 2013 12:48 AM by Carranza

Do you have a spam issue on this site; I also am a blogger,

and I was curious about your situation; we have created some nice procedures and we

are looking to exchange solutions with other folks, please shoot me an email if

interested.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Thursday, April 18, 2013 2:52 AM by Herzog

It's really a great and helpful piece of information. I'm happy that you

simply shared this helpful info with us. Please keep us informed like this.

Thanks for sharing.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Thursday, April 18, 2013 9:12 AM by Francis

Its such as you learn my mind! You seem to understand a lot about

this, such as you wrote the ebook in it or something.

I feel that you simply could do with a few p.c.

to force the message house a bit, however instead of that,

this is excellent blog. A great read. I will

definitely be back.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 19, 2013 5:16 AM by Florez

This is my first time pay a visit at here and i am really impressed to

read everthing at alone place.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, April 19, 2013 5:25 AM by Gallo

This is really interesting, You're a very skilled blogger. I've joined your rss feed and look forward to seeking more of your excellent post.

Also, I've shared your site in my social networks!

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Sunday, April 21, 2013 9:27 AM by Rhoden

Magnificent goods from you, man. I have understand

your stuff previous to and

you are just extremely excellent. I really like what

you've acquired here, certainly like what you're

saying and the way in which you

say it. You make it entertaining and you still care

for to keep it smart. I

can not wait to read far more from you. This is really a

tremendous website.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Tuesday, May 07, 2013 5:40 AM by Vest

Magnificent beat ! I would like to apprentice while you amend your site, how could i subscribe for

a weblog website? The account helped me a appropriate deal.

I had been tiny bit acquainted of this your broadcast offered vibrant clear concept

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Wednesday, May 08, 2013 6:49 AM by Kendrick

I've been surfing on-line more than 3 hours nowadays, yet I never discovered any attention-grabbing article like yours. It is lovely worth sufficient for me. In my opinion, if all site owners and bloggers made just right content as you probably did, the internet shall be much more helpful than ever before.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Saturday, May 11, 2013 4:43 PM by qzaphcthkn@gmail.com

i really like your post and will read your blog

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Monday, May 13, 2013 8:18 PM by dygqzw@gmail.com

zoebxibopjcbp, , YqunQNF.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Thursday, May 16, 2013 4:38 AM by Abrams

I have learn several good stuff here. Certainly value bookmarking for revisiting.

I surprise how so much effort you put to create

this sort of fantastic informative web site.

# re: Understanding C# async / await (2) Awaitable / Awaiter Pattern

Friday, May 17, 2013 6:51 AM by Carvalho

Hi to every one, it's really a pleasant for me to visit this website, it includes precious Information.

Leave a Comment

(required) 
(required) 
(optional)
(required)