Understanding C# async / await (1) Compilation

Now the async / await keywords are in C#. Just like the async and ! in F#, this new C# feature provides great convenience. There are many nice documents talking about how to use async / await in specific scenarios, like using async methods in ASP.NET 4.5 and in ASP.NET MVC 4, etc. In this article we will look at the real code working behind the syntax sugar.

According to MSDN:

The async modifier indicates that the method, lambda expression, or anonymous method that it modifies is asynchronous.

Since lambda expression / anonymous method will be compiled to normal method, we will focus on normal async method.

Preparation

First of all, Some helper methods need to make up.

internal class HelperMethods
{
    private static void IO()
    {
        using (WebClient client = new WebClient())
        {
            Enumerable.Repeat("http://weblogs.asp.net/dixin", 10).Select(client.DownloadString).ToArray();
        }
    }

    internal static int Method(int arg0, int arg1)
    {
        int result = arg0 + arg1;
        IO(); // Do some long running IO.
        return result;
    }

    internal static Task<int> MethodTask(int arg0, int arg1)
    {
        Task<int> task = new Task<int>(() => Method(arg0, arg1));
        task.Start(); // Hot task (started task) should always be returned.
        return task;
    }

    internal static void Before()
    {
    }

    internal static void Continuation1(int arg)
    {
    }

    internal static void Continuation2(int arg)
    {
    }
}

Here Method() is a long running method doing some IO. Then MethodTask() wraps it into a Task and return that Task. Nothing special here.

Await something in async method

Since MethodTask() returns Task, let’s try to await it:

internal class AsyncMethods
{
    internal static async Task<int> MethodAsync(int arg0, int arg1)
    {
        int result = await HelperMethods.MethodTask(arg0, arg1);
        return result;
    }
}

Because we used await in the method, async must be put on the method. Now we get the first async method. According to the naming convenience, it is called MethodAsync. Of course a async method can be awaited. So we have a CallMethodAsync() to call MethodAsync():

internal class AsyncMethods
{
    internal static async Task<int> CallMethodAsync(int arg0, int arg1)
    {
        int result = await MethodAsync(arg0, arg1);
        return result;
    }
}

After compilation, MethodAsync() and CallMethodAsync() becomes the same logic. This is the code of MethodAsyc():

internal class CompiledAsyncMethods
{
    [DebuggerStepThrough]
    [AsyncStateMachine(typeof(MethodAsyncStateMachine))] // async
    internal static /*async*/ Task<int> MethodAsync(int arg0, int arg1)
    {
        MethodAsyncStateMachine methodAsyncStateMachine = new MethodAsyncStateMachine()
            {
                Arg0 = arg0,
                Arg1 = arg1,
                Builder = AsyncTaskMethodBuilder<int>.Create(),
                State = -1
            };
        methodAsyncStateMachine.Builder.Start(ref methodAsyncStateMachine);
        return methodAsyncStateMachine.Builder.Task;
    }
}

It just creates and starts a state machine MethodAsyncStateMachine:

[CompilerGenerated]
[StructLayout(LayoutKind.Auto)]
internal struct MethodAsyncStateMachine : IAsyncStateMachine
{
    public int State;
    public AsyncTaskMethodBuilder<int> Builder;
    public int Arg0;
    public int Arg1;
    public int Result;
    private TaskAwaiter<int> awaitor;

    void IAsyncStateMachine.MoveNext()
    {
        try
        {
            if (this.State != 0)
            {
                this.awaitor = HelperMethods.MethodTask(this.Arg0, this.Arg1).GetAwaiter();
                if (!this.awaitor.IsCompleted)
                {
                    this.State = 0;
                    this.Builder.AwaitUnsafeOnCompleted(ref this.awaitor, ref this);
                    return;
                }
            }
            else
            {
                this.State = -1;
            }

            this.Result = this.awaitor.GetResult();
        }
        catch (Exception exception)
        {
            this.State = -2;
            this.Builder.SetException(exception);
            return;
        }

        this.State = -2;
        this.Builder.SetResult(this.Result);
    }

    [DebuggerHidden]
    void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine param0)
    {
        this.Builder.SetStateMachine(param0);
    }
}

The generated code has been cleaned up so it is readable and can be compiled. Several things can be observed here:

  • The async modifier is gone, which shows, unlike other modifiers (e.g. static), there is no such IL/CLR level “async” stuff. It becomes a AsyncStateMachineAttribute. This is similar to the compilation of extension method.
  • The generated state machine is very similar to the state machine of C# yield syntax sugar.
  • The local variables (arg0, arg1, result) are compiled to fields of the state machine.
  • The real code (await HelperMethods.MethodTask(arg0, arg1)) is compiled into MoveNext(): HelperMethods.MethodTask(this.Arg0, this.Arg1).GetAwaiter().

CallMethodAsync() will create and start its own state machine CallMethodAsyncStateMachine:

internal class CompiledAsyncMethods
{
    [DebuggerStepThrough]
    [AsyncStateMachine(typeof(CallMethodAsyncStateMachine))] // async
    internal static /*async*/ Task<int> CallMethodAsync(int arg0, int arg1)
    {
        CallMethodAsyncStateMachine callMethodAsyncStateMachine = new CallMethodAsyncStateMachine()
            {
                Arg0 = arg0,
                Arg1 = arg1,
                Builder = AsyncTaskMethodBuilder<int>.Create(),
                State = -1
            };
        callMethodAsyncStateMachine.Builder.Start(ref callMethodAsyncStateMachine);
        return callMethodAsyncStateMachine.Builder.Task;
    }
}

CallMethodAsyncStateMachine has the same logic as MethodAsyncStateMachine above. The detail of the state machine will be discussed soon. Now it is clear that:

  • async /await is a C# level syntax sugar.
  • There is no difference to await a async method or a normal method. A method returning Task will be awaitable, or – to be precise – Task can be awaited.

State machine and continuation

To demonstrate more details in the state machine, a more complex method is created:

internal class AsyncMethods
{
    internal static async Task<int> MultiCallMethodAsync(int arg0, int arg1, int arg2, int arg3)
    {
        HelperMethods.Before();
        int resultOfAwait1 = await MethodAsync(arg0, arg1);
        HelperMethods.Continuation1(resultOfAwait1);
        int resultOfAwait2 = await MethodAsync(arg2, arg3);
        HelperMethods.Continuation2(resultOfAwait2);
        int resultToReturn = resultOfAwait1 + resultOfAwait2;
        return resultToReturn;
    }
}

In this method:

  • There are multiple awaits.
  • There are code before the awaits, and continuation code after each await

After compilation, this multi-await method becomes the same as above single-await methods:

internal class CompiledAsyncMethods
{
    [DebuggerStepThrough]
    [AsyncStateMachine(typeof(MultiCallMethodAsyncStateMachine))] // async
    internal static /*async*/ Task<int> MultiCallMethodAsync(int arg0, int arg1, int arg2, int arg3)
    {
        MultiCallMethodAsyncStateMachine multiCallMethodAsyncStateMachine = new MultiCallMethodAsyncStateMachine()
            {
                Arg0 = arg0,
                Arg1 = arg1,
                Arg2 = arg2,
                Arg3 = arg3,
                Builder = AsyncTaskMethodBuilder<int>.Create(),
                State = -1
            };
        multiCallMethodAsyncStateMachine.Builder.Start(ref multiCallMethodAsyncStateMachine);
        return multiCallMethodAsyncStateMachine.Builder.Task;
    }
}

It creates and starts one single state machine, MultiCallMethodAsyncStateMachine:

[CompilerGenerated]
[StructLayout(LayoutKind.Auto)]
internal struct MultiCallMethodAsyncStateMachine : IAsyncStateMachine
{
    public int State;
    public AsyncTaskMethodBuilder<int> Builder;
    public int Arg0;
    public int Arg1;
    public int Arg2;
    public int Arg3;
    public int ResultOfAwait1;
    public int ResultOfAwait2;
    public int ResultToReturn;
    private TaskAwaiter<int> awaiter;

    void IAsyncStateMachine.MoveNext()
    {
        try
        {
            switch (this.State)
            {
                case -1:
                    HelperMethods.Before();
                    this.awaiter = AsyncMethods.MethodAsync(this.Arg0, this.Arg1).GetAwaiter();
                    if (!this.awaiter.IsCompleted)
                    {
                        this.State = 0;
                        this.Builder.AwaitUnsafeOnCompleted(ref this.awaiter, ref this);
                    }
                    break;
                case 0:
                    this.ResultOfAwait1 = this.awaiter.GetResult();
                    HelperMethods.Continuation1(this.ResultOfAwait1);
                    this.awaiter = AsyncMethods.MethodAsync(this.Arg2, this.Arg3).GetAwaiter();
                    if (!this.awaiter.IsCompleted)
                    {
                        this.State = 1;
                        this.Builder.AwaitUnsafeOnCompleted(ref this.awaiter, ref this);
                    }
                    break;
                case 1:
                    this.ResultOfAwait2 = this.awaiter.GetResult();
                    HelperMethods.Continuation2(this.ResultOfAwait2);
                    this.ResultToReturn = this.ResultOfAwait1 + this.ResultOfAwait2;
                    this.State = -2;
                    this.Builder.SetResult(this.ResultToReturn);
                    break;
            }
        }
        catch (Exception exception)
        {
            this.State = -2;
            this.Builder.SetException(exception);
        }
    }

    [DebuggerHidden]
    void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
    {
        this.Builder.SetStateMachine(stateMachine);
    }
}

The above code is already cleaned up, but there are still a lot of things. More clean up can be done, and the state machine can be very simple:

[CompilerGenerated]
[StructLayout(LayoutKind.Auto)]
internal struct MultiCallMethodAsyncStateMachine : IAsyncStateMachine
{
    // State:
    // -1: Begin
    //  0: 1st await is done
    //  1: 2nd await is done
    //     ...
    // -2: End
    public int State;
    public TaskCompletionSource<int> ResultToReturn; // int resultToReturn ...
    public int Arg0; // int Arg0
    public int Arg1; // int arg1
    public int Arg2; // int arg2
    public int Arg3; // int arg3
    public int ResultOfAwait1; // int resultOfAwait1 ...
    public int ResultOfAwait2; // int resultOfAwait2 ...
    private Task<int> currentTaskToAwait;

    /// <summary>
    /// Moves the state machine to its next state.
    /// </summary>
    void IAsyncStateMachine.MoveNext()
    {
        try
        {
            switch (this.State)
            {
                // Orginal code is splitted by "case"s:
                // case -1:
                //      HelperMethods.Before();
                //      MethodAsync(Arg0, arg1);
                // case 0:
                //      int resultOfAwait1 = await ...
                //      HelperMethods.Continuation1(resultOfAwait1);
                //      MethodAsync(arg2, arg3);
                // case 1:
                //      int resultOfAwait2 = await ...
                //      HelperMethods.Continuation2(resultOfAwait2);
                //      int resultToReturn = resultOfAwait1 + resultOfAwait2;
                //      return resultToReturn;
                case -1: // -1 is begin.
                    HelperMethods.Before(); // Code before 1st await.
                    this.currentTaskToAwait = AsyncMethods.MethodAsync(this.Arg0, this.Arg1); // 1st task to await
                    // When this.currentTaskToAwait is done, run this.MoveNext() and go to case 0.
                    this.State = 0;
                    IAsyncStateMachine this1 = this; // Cannot use "this" in lambda so create a local variable.
                    this.currentTaskToAwait.ContinueWith(_ => this1.MoveNext()); // Callback
                    break;
                case 0: // Now 1st await is done.
                    this.ResultOfAwait1 = this.currentTaskToAwait.Result; // Get 1st await's result.
                    HelperMethods.Continuation1(this.ResultOfAwait1); // Code after 1st await and before 2nd await.
                    this.currentTaskToAwait = AsyncMethods.MethodAsync(this.Arg2, this.Arg3); // 2nd task to await
                    // When this.currentTaskToAwait is done, run this.MoveNext() and go to case 1.
                    this.State = 1;
                    IAsyncStateMachine this2 = this; // Cannot use "this" in lambda so create a local variable.
                    this.currentTaskToAwait.ContinueWith(_ => this2.MoveNext()); // Callback
                    break;
                case 1: // Now 2nd await is done.
                    this.ResultOfAwait2 = this.currentTaskToAwait.Result; // Get 2nd await's result.
                    HelperMethods.Continuation2(this.ResultOfAwait2); // Code after 2nd await.
                    int resultToReturn = this.ResultOfAwait1 + this.ResultOfAwait2; // Code after 2nd await.
                    // End with resultToReturn.
                    this.State = -2; // -2 is end.
                    this.ResultToReturn.SetResult(resultToReturn);
                    break;
            }
        }
        catch (Exception exception)
        {
            // End with exception.
            this.State = -2; // -2 is end.
            this.ResultToReturn.SetException(exception);
        }
    }

    /// <summary>
    /// Configures the state machine with a heap-allocated replica.
    /// </summary>
    /// <param name="stateMachine">The heap-allocated replica.</param>
    [DebuggerHidden]
    void IAsyncStateMachine.SetStateMachine(IAsyncStateMachine stateMachine)
    {
        // No core logic.
    }
}

Only Task and TaskCompletionSource are involved in this version. And MultiCallMethodAsync() can be simplified to:

[DebuggerStepThrough]
[AsyncStateMachine(typeof(MultiCallMethodAsyncStateMachine))] // async
internal static /*async*/ Task<int> MultiCallMethodAsync_(int arg0, int arg1, int arg2, int arg3)
{
    MultiCallMethodAsyncStateMachine multiCallMethodAsyncStateMachine = new MultiCallMethodAsyncStateMachine()
        {
            Arg0 = arg0,
            Arg1 = arg1,
            Arg2 = arg2,
            Arg3 = arg3,
            ResultToReturn = new TaskCompletionSource<int>(),
            // -1: Begin
            //  0: 1st await is done
            //  1: 2nd await is done
            //     ...
            // -2: End
            State = -1
        };
    (multiCallMethodAsyncStateMachine as IAsyncStateMachine).MoveNext(); // Original code are in this method.
    return multiCallMethodAsyncStateMachine.ResultToReturn.Task;
}

Now the whole state machine becomes very clear - it is about callback:

  • Original code are split into pieces by “await”s, and each piece is put into each “case” in the state machine. Here the 2 awaits split the code into 3 pieces, so there are 3 “case”s.
  • The “piece”s are chained by callback, that is done by Builder.AwaitUnsafeOnCompleted(callback), or currentTaskToAwait.ContinueWith(callback) in the simplified code.
  • A previous “piece” will end with a Task (which is to be awaited), when the task is done, it will callback the next “piece”.
  • The state machine’s state works with the “case”s to ensure the code “piece”s executes one after another.

Callback

Since it is about callback, the simplification  can go even further – the entire state machine can be completely purged. Now MultiCallMethodAsync() becomes:

internal static Task<int> MultiCallMethodAsync(int arg0, int arg1, int arg2, int arg3)
{
    TaskCompletionSource<int> taskCompletionSource = new TaskCompletionSource<int>();
    try
    {
        // Oringinal code begins.
        HelperMethods.Before();
        MethodAsync(arg0, arg1).ContinueWith(await1 => { int resultOfAwait1 = await1.Result;
            HelperMethods.Continuation1(resultOfAwait1);
            MethodAsync(arg2, arg3).ContinueWith(await2 => { int resultOfAwait2 = await2.Result;
                HelperMethods.Continuation2(resultOfAwait2);
                int resultToReturn = resultOfAwait1 + resultOfAwait2;
        // Oringinal code ends.
                    
                taskCompletionSource.SetResult(resultToReturn);
            });
        });
    }
    catch (Exception exception)
    {
        taskCompletionSource.SetException(exception);
    }

    return taskCompletionSource.Task;
}

Please compare with the original async / await code:

HelperMethods.Before();
int resultOfAwait1 = await MethodAsync(arg0, arg1);
HelperMethods.Continuation1(resultOfAwait1);
int resultOfAwait2 = await MethodAsync(arg2, arg3);
HelperMethods.Continuation2(resultOfAwait2);
int resultToReturn = resultOfAwait1 + resultOfAwait2;
return resultToReturn;

Yeah that is the magic of C# async / await:

  • Await is literally pretending to wait. In a await expression, a Task object will be return immediately so that caller is not blocked. The continuation code is compiled as that Task’s callback code.
  • When that task is done, continuation code will execute.

Please notice that many details inside the state machine are omitted for simplicity, like context caring, etc. If you want to have a detailed picture, please do check out the source code of AsyncTaskMethodBuilder and TaskAwaiter.

Published Friday, November 02, 2012 5:24 PM by Dixin
Filed under: , , ,

Comments

# re: Understanding C# async / await (1) Compilation

Saturday, November 03, 2012 12:36 PM by vince lin

This is a very good article on C#

# Understanding C# async / await (1) Compilation &#8211; Dixin&#039;s Blog : Atom Wire

Pingback from  Understanding C# async / await (1) Compilation &#8211; Dixin&#039;s Blog  : Atom Wire

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

Thursday, November 08, 2012 3:11 AM by Dixin's Blog

What is awaitable Part 1 shows that any Task is awaitable. Actually there are other awaitable types.

# ??????async/await??????????????? &laquo; ???????????????

Tuesday, November 20, 2012 3:35 AM by ??????async/await??????????????? « ???????????????

Pingback from  ??????async/await??????????????? &laquo;  ???????????????

# re: Understanding C# async / await (1) Compilation

Thursday, March 14, 2013 11:52 PM by insanity workout

www.rastafaritvuk.com/.../guidance-on-how-to-perform-the-insanity-workout-sessions-well

# re: Understanding C# async / await (1) Compilation

Friday, March 15, 2013 1:03 AM by insanity workout

www.j-maher.com/.../showthread.php

# re: Understanding C# async / await (1) Compilation

Friday, March 15, 2013 5:03 AM by insanity workout

horizonnews.com.au/.../Fefofekag

# re: Understanding C# async / await (1) Compilation

Saturday, March 16, 2013 5:03 AM by insanity

www.iccup.com/.../Does_Zumba_Work_As_An_Effective_Technique_Of_.html

# re: Understanding C# async / await (1) Compilation

Sunday, March 17, 2013 11:59 PM by insanity workout

fightwheel49.wordpress.com/.../reasonably-priced-isabel-marant-just-meets-you

# re: Understanding C# async / await (1) Compilation

Monday, March 18, 2013 12:20 AM by insanity

fashion88520.soup.io/.../The-Zumba-Training-videos-Undoubtedly-are-a

# re: Understanding C# async / await (1) Compilation

Monday, March 18, 2013 1:20 AM by insanity workout program

huyayaxinqin.posterous.com/just-how-the-secret-behind-christian-loubouti

# re: Understanding C# async / await (1) Compilation

Monday, March 18, 2013 11:45 PM by christian louboutin

www.awebcafe.com/.../791024

# re: Understanding C# async / await (1) Compilation

Tuesday, March 19, 2013 12:01 AM by zumba dvd sale

skoopdo.fr/.../Isabel-Marant-Sneakers-Attractive-Style-Or-Design

# re: Understanding C# async / await (1) Compilation

Tuesday, March 19, 2013 1:43 AM by insanity workout

test.woothemes.com/.../isabel-marrant-sneaker-has-a-great-fit

# re: Understanding C# async / await (1) Compilation

Tuesday, March 19, 2013 9:22 AM by insanity workout

board.rfps.kh.edu.tw/profile.php

# re: Understanding C# async / await (1) Compilation

Tuesday, March 19, 2013 11:03 AM by insanity workout

sneeci-social.us/.../the-insanity-workout-in-the

# re: Understanding C# async / await (1) Compilation

Tuesday, March 19, 2013 10:34 PM by insanity

fashion123123.bloggospace.de/.../How-A-Insanity-Workout-Works

# re: Understanding C# async / await (1) Compilation

Wednesday, March 20, 2013 12:13 PM by louboutin sale

www.erosport.ru/.../Immodayordele

# re: Understanding C# async / await (1) Compilation

Thursday, March 21, 2013 10:34 AM by insanity

97000.ekk.bg/.../profile.php

# re: Understanding C# async / await (1) Compilation

Thursday, March 21, 2013 10:28 PM by zumba dvd

greasychimp.com/.../good-value-isabel-marant-just-lives-with-you

# re: Understanding C# async / await (1) Compilation

Thursday, March 21, 2013 11:32 PM by christian louboutin uk

http://mvbm.webs.com/

# re: Understanding C# async / await (1) Compilation

Friday, March 22, 2013 6:26 AM by Isabel Marant

www.atomixstar.com/.../showthread.php

# re: Understanding C# async / await (1) Compilation

Saturday, March 23, 2013 12:25 AM by insanity workout

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

# re: Understanding C# async / await (1) Compilation

Monday, March 25, 2013 12:20 AM by insanity

http://jllfghfdh.webs.com/

# re: Understanding C# async / await (1) Compilation

Monday, March 25, 2013 12:25 AM by Zumba dvd

beta.truck.net/.../p90x-review-and-work-out-money

# re: Understanding C# async / await (1) Compilation

Monday, March 25, 2013 12:43 AM by Isabel Marant

fashion88520.over-blog.com/article-the-easiest-way-to-find-out-fine-isabel-marant-sneakers-114582352.html

# re: Understanding C# async / await (1) Compilation

Tuesday, March 26, 2013 12:09 AM by louboutin outlet

tncommunity.info/.../low-worth-small-league-sneakers

# re: Understanding C# async / await (1) Compilation

Tuesday, March 26, 2013 11:43 PM by Isabel marant sneakers

vech.ru/.../tools.php

# re: Understanding C# async / await (1) Compilation

Wednesday, March 27, 2013 3:00 AM by insanity workout australia

http://fjhngdfhd.webs.com/

# re: Understanding C# async / await (1) Compilation

Wednesday, March 27, 2013 8:02 AM by insanity

dl3banaat.com/.../showthread.php Result: page too large, not fully downloaded; chosen nickname "nodendocochuh"; captcha recognized; registered (100%); logged in; nofollow is found; success; (reply to topic);

# re: Understanding C# async / await (1) Compilation

Wednesday, March 27, 2013 8:16 AM by strona

Great in black and white satisfy and fantastic explain. Your website deserves every one of the confirmed opinion it's been getting.

# re: Understanding C# async / await (1) Compilation

Wednesday, March 27, 2013 11:16 AM by Solano

My partner and I absolutely love your blog and find

most of your post's to be precisely what I'm looking for.

Do you offer guest writers to write content for you personally?

I wouldn't mind producing a post or elaborating on a number of the subjects you write related to here. Again, awesome website!

# re: Understanding C# async / await (1) Compilation

Thursday, March 28, 2013 4:26 AM by insanity workout

ghmkghjhgjgffgjjf.webs.com

# re: Understanding C# async / await (1) Compilation

Thursday, March 28, 2013 7:15 AM by insanity workout

ikiwi.me/.../zumba-workouts-enjoyable-means-slim-down

# re: Understanding C# async / await (1) Compilation

Thursday, March 28, 2013 7:42 AM by insanity workout

videoaok.com/.../

# re: Understanding C# async / await (1) Compilation

Thursday, March 28, 2013 8:50 PM by zumba dvd

ebook-music-software.com/.../145758

# re: Understanding C# async / await (1) Compilation

Saturday, March 30, 2013 1:01 AM by Braswell

Today, I went to the beach front with my kids. I found

a sea shell and gave it to my 4 year old daughter and said "You can hear the ocean if you put this to your ear." She put the shell to her ear and screamed.

There was a hermit crab inside and it pinched her ear.

She never wants to go back! LoL I know this is completely off topic but I had to tell

someone!

# re: Understanding C# async / await (1) Compilation

Sunday, March 31, 2013 11:58 PM by insanity workout

ebook-music-software.com/.../152933

# re: Understanding C# async / await (1) Compilation

Monday, April 01, 2013 5:07 AM by Zumba dvd

http://dfgsfwa.jimdo.com/

# re: Understanding C# async / await (1) Compilation

Monday, April 01, 2013 5:21 AM by zumba

politicaljokes.us/how-the-zumba-dvd-collection-can-easily-assist-you-lose-weight

# re: Understanding C# async / await (1) Compilation

Monday, April 01, 2013 8:39 AM by insanity workout

fationhanbags.livejournal.com/408131.html

# re: Understanding C# async / await (1) Compilation

Monday, April 01, 2013 10:30 AM by insanity workout

forum.fantasy.tw/profile.php

# re: Understanding C# async / await (1) Compilation

Monday, April 01, 2013 12:38 PM by christian louboutin

may715.spruz.com/.../blog.htm

# re: Understanding C# async / await (1) Compilation

Monday, April 01, 2013 8:28 PM by insanity workout

columbusbbw.com/.../1615544

# re: Understanding C# async / await (1) Compilation

Wednesday, April 03, 2013 1:44 PM by Louis Vuitton

louievillalobos.com/profile.php

# re: Understanding C# async / await (1) Compilation

Thursday, April 04, 2013 7:32 AM by louis vuitton wallet

www.boltaindia.com/index.php

# re: Understanding C# async / await (1) Compilation

Thursday, April 04, 2013 2:07 PM by Dupuis

Your style is very unique in comparison to other people I have read stuff from.

Many thanks for posting when you've got the opportunity, Guess I will just book mark this site.

# re: Understanding C# async / await (1) Compilation

Sunday, April 07, 2013 3:51 AM by insanity workout

gohtv.com/.../the-queen-in-the-high-heels

# re: Understanding C# async / await (1) Compilation

Sunday, April 07, 2013 6:03 AM by zumba dvd

http://erf3er4e.jigsy.com/

# re: Understanding C# async / await (1) Compilation

Sunday, April 07, 2013 11:46 AM by insanity workout

classes.wormdiet.net/.../member.php

# re: Understanding C# async / await (1) Compilation

Sunday, April 07, 2013 10:26 PM by Zumba dvd

24tur.ru/.../index.php             Result: text captcha decoded; chosen nickname "Sareweedloday"; registered (100%); logged in; success - posted to "24TUR.ru"; BB-code not working;

# re: Understanding C# async / await (1) Compilation

Tuesday, April 09, 2013 12:31 AM by insanity workout canada

dzalgeriadz.eb2a.com/showthread.php Result: SERVER ERROR (host acc.zao.msk.ru,host resistenciaeuropea.com); chosen nickname "avadlence"; captcha recognized; registered (100%); logged in; nofollow is found; success (from first page); (reply to topic);

# re: Understanding C# async / await (1) Compilation

Tuesday, April 09, 2013 9:32 AM by insanity

forum.cobadulu.com/index.php

# re: Understanding C# async / await (1) Compilation

Tuesday, April 09, 2013 10:51 AM by zumba dvd

ugandasister0.jigsy.com/.../Getting-Info-Regarding-Louis-Vuitton-Bags

# re: Understanding C# async / await (1) Compilation

Tuesday, April 09, 2013 5:54 PM by louboutin sale

www.entertainermedia.com/.../brand-testimonial-of-louis-vuitt

# re: Understanding C# async / await (1) Compilation

Tuesday, April 09, 2013 6:40 PM by Lomax

I know this if off topic but I'm looking into starting my own blog and was curious what all is needed to get setup? I'm assuming having a blog like yours would cost

a pretty penny? I'm not very internet savvy so I'm not 100% sure. Any recommendations or advice would be greatly appreciated. Appreciate it

# re: Understanding C# async / await (1) Compilation

Tuesday, April 09, 2013 9:52 PM by Insanity

urbanians.com/.../showthread.php Result: chosen nickname "Eladevispalse"; captcha recognized; registered (100%); logged in; nofollow is found; success; (reply to topic);

# re: Understanding C# async / await (1) Compilation

Wednesday, April 10, 2013 12:25 AM by Isabel Marant

www.emeryint.org/.../memberlist.php

# re: Understanding C# async / await (1) Compilation

Wednesday, April 10, 2013 12:54 AM by insanity

forum.soft-travel.ru/index.php

# re: Understanding C# async / await (1) Compilation

Wednesday, April 10, 2013 9:08 AM by insanity workout

http://hgijyhk.jimdo.com/

# re: Understanding C# async / await (1) Compilation

Wednesday, April 10, 2013 9:59 PM by insanity

bicyclereviewhq.com/.../125790

# re: Understanding C# async / await (1) Compilation

Thursday, April 11, 2013 6:08 AM by insanity

skaters.com/.../profile.php

# re: Understanding C# async / await (1) Compilation

Friday, April 12, 2013 12:15 AM by Rico

Hello there! Do you know if they make any plugins to help with Search Engine Optimization?

I'm trying to get my blog to rank for some targeted keywords but I'm not seeing very

good success. If you know of any please share.

Thanks!

# re: Understanding C# async / await (1) Compilation

Friday, April 12, 2013 1:59 AM by Angelo

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

just wondering if you get a lot of spam responses?

If so how do you protect against it, any plugin or anything you can advise?

I get so much lately it's driving me mad so any help is very much appreciated.

# re: Understanding C# async / await (1) Compilation

Friday, April 12, 2013 3:45 AM by zumba

kekobockh.eshost.es/index.php

# re: Understanding C# async / await (1) Compilation

Sunday, April 14, 2013 5:21 AM by Mendenhall

Heya. Sorry to trouble you but I happened to run across your blog website and

noticed you're using the exact same template as me. The only problem is on my site, I'm unable to get

the theme looking like yours. Would you mind contacting me at: mariana_mendenhall@gawab.

com so I can get this figured out. By the way I've bookmarked your internet site: weblogs.asp.net/.../understanding-c-async-await-1-compilation.aspx and will certainly be visiting often. Thanks alot :)!

# re: Understanding C# async / await (1) Compilation

Monday, April 15, 2013 3:56 AM by Insanity

stroyka-service.ru/.../Damemaillog

# re: Understanding C# async / await (1) Compilation

Wednesday, April 17, 2013 7:13 AM by Estrada

Please let me know if you're looking for a article writer for your weblog. You have some really good posts and I believe I would be a good asset. If you ever want to take some of the load off, I'd love to write some articles for your

blog in exchange for a link back to mine.

Please shoot me an email if interested. Kudos!

# re: Understanding C# async / await (1) Compilation

Thursday, April 18, 2013 10:48 PM by Branham

I'm new to developing internet sites and I was wanting to know if having your website title related to your content really that critical? I see your title, " Understanding C# async / await (1) Compilation " does appear to be spot on with what your website is about but yet, I prefer to keep my title less content descriptive and based more around site branding. Would you think this is a good idea or bad idea? Any assistance would be greatly appreciated.

# re: Understanding C# async / await (1) Compilation

Tuesday, April 23, 2013 11:12 AM by Quezada

“Understanding C# async / await (1) Compilation -

Dixin's Blog” honestly got myself addicted with your webpage! Iwill certainly wind up being back again a whole lot more normally. Thanks a lot ,Nell

# re: Understanding C# async / await (1) Compilation

Wednesday, April 24, 2013 12:00 AM by Wise

It's a shame you don't have a donate button! I'd certainly donate to this outstanding blog! I guess for now i'll

settle for bookmarking and adding your RSS feed to my Google account.

I look forward to brand new updates and will share this site with my Facebook group.

Talk soon!

# re: Understanding C# async / await (1) Compilation

Thursday, April 25, 2013 4:10 AM by Dooley

Your web site seems to be having some compatibilty issues in my ie browser.

The text seems to be running off the webpage pretty bad.

If you would like you can contact me at: rheadooley@wildmail.

com and I'll shoot you over a screen shot of the problem.

Leave a Comment

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