是否可以在没有等待和异步的情况下使用Task.Run?

时间:2020-04-20 22:01:52

标签: c# asynchronous async-await task

我做了一个简单的示例,该示例从数据库表返回数据。

private Task<DataSet> GetDataAsync(string connStr)
    {
        return Task.Run(() =>
        {                
            DataSet ds = new DataSet();
            using (SqlConnection conn = new SqlConnection(connStr))
            {
                conn.Open();
                using(SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE", conn))
                {
                    using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                    {
                        da.Fill(ds);
                    }
                }
            }
            return ds;
        });            
    }

如果将方法标记为 async 而不是 return Task.Run ,我会使用 Return await Task.Run有什么区别?

1 个答案:

答案 0 :(得分:1)

简短的回答是“是”和“是”。

您可以使用不带awaitasync的Task.Run。显然。这就是您的代码当前的编写方式和工作方式。

如果将方法标记为async,则必须使用return await Task.Run

现在,在这种情况下,它没有任何实际价值,因为您只是立即返回Task.Run的结果。代码调用者可以根据您的方法结果独立决定是否使用await

只有在您的代码在整个方法中都使用await时,它才会起作用。例如,如果有一个FillAsync方法,那么此代码将有效:

private async Task<DataSet> GetData2Async(string connStr)
{
    DataSet ds = new DataSet();
    using (SqlConnection conn = new SqlConnection(connStr))
    {
        conn.Open();
        using (SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE", conn))
        {
            using (SqlDataAdapter da = new SqlDataAdapter(cmd))
            {
                await da.FillAsync(ds);
            }
        }
    }
    return ds;
}

请注意,await da.FillAsync(ds);是虚构的,仅供说明。

在这段代码中,您需要在方法上使用asyncawait FillAsync