什么是创建等效功能的正确方法

时间:2013-04-21 15:25:01

标签: c# asynchronous task-parallel-library async-await

我对如何真正创造适当的等待功能感到困惑。我没有完全理解整个概念,可能是由于语言障碍:)

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;
    }

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;
            });
    }

我想知道它的原因是因为我通过便宜的方式创造了可以接受的方法。

实施例

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

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

1 个答案:

答案 0 :(得分:1)

您希望转到A路线。编译器将负责创建返回的任务并返回实际的整数(如果可用)。

您可以阅读Asynchronous Programming - Pause and Play with ...以获得有关编译器内部工作(如何将方法转换为状态机)的一些深入信息。