Nerfpl
Nerfpl

Reputation: 167

What is a proper way to create awaitable function

I have dilemma on how to actually create proper awaitable function. I don't get the entire concept fully, probably due the language barrier :)

A

public async Task<int> InsertASync(string tableName, Dictionary<string, string> data)
    {
        int r = 0;

        using (SQLiteConnection con = NewConnection())
        {
            await con.OpenAsync();
            using (SQLiteCommand com = new SQLiteCommand(Query_Insert(tableName, data), con))
            {
                r = await com.ExecuteNonQueryAsync();
            }
            con.Close();
        }

        return r;
    }

or

B

public Task<int> InsertASync(string tableName, Dictionary<string, string> data)
    {
        return Task<int>.Run(async () =>
            {
                int r = 0;

                using (SQLiteConnection con = NewConnection())
                {
                    await con.OpenAsync();
                    using (SQLiteCommand com = new SQLiteCommand(Query_Insert(tableName, data), con))
                    {
                        r = await com.ExecuteNonQueryAsync();
                    }
                    con.Close();
                }

                return r;
            });
    }

Reason i'm wondering about it is because the way i create awaitable methods via cheap way.

Example

public void DoHeavyWork() //this will block UI
{
    //Do work
}

public Task DoHeavyWorkASync() //this won't
{
    return Task.Run(() =>
    {
         DoHeavyWork();
    });
}

Upvotes: 3

Views: 1899

Answers (1)

G. Stoynev
G. Stoynev

Reputation: 7783

You want to go the A route. The compiler will take care of creating the returned task and returning the actual integer, when available.

You can read Asynchronous Programming - Pause and Play with ... for some good in-depth information on what the compiler does internally (how your method is converted into a state machine)

Upvotes: 1

Related Questions