3

適切な待機可能な関数を実際に作成する方法についてジレンマがあります。おそらく言語の壁が原因で、概念全体を完全には理解していません:)

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

また

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

私が疑問に思っている理由は、安価な方法で待機可能なメソッドを作成する方法だからです。

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

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

1 に答える 1

1

あなたはAルートに行きたいです。コンパイラは、返されたタスクを作成し、利用可能な場合は実際の整数を返します。

Asynchronous Programming - Pause and Play with ...を読むと、コンパイラが内部で行うこと (メソッドがステート マシンにどのように変換されるか) に関する詳細な情報が得られます。

于 2013-04-21T16:29:04.967 に答える