.net - 使用异步 .net 4.0 返回数据表

标签 .net c#-4.0 async-await

我有一个返回数据表的方法。我认为使用 .net 4.0 我可以只是异步逻辑并返回数据。但此代码返回空数据表对象。任何想法这段代码有什么问题。

public DataTable GetData(string sql, string connectionName)
{
    DataTable dt = (DataTable)GetDataAsync(sql, connectionName).AsyncState;
    return dt;
}

private async Task<DataTable> GetDataAsync(string sql, string connectionName)
{
    return await TaskEx.Run(() => { return FillData(sql, connectionName); });
}

private DataTable FillData(string sql, string connectionName)
{
    SqlConnection conn = _connections.Where(w => w.ConnectionName == connectionName).Single().Connection;
    SqlDataAdapter adp = new SqlDataAdapter(sql, conn);
    DataSet ds = new DataSet();

    adp.Fill(ds);

    return ds.Tables[0];
}

最佳答案

首先,您不能使用 async/await使用 .NET 4 或 C# 4。这是 C# 5 中的一项新功能。有安装在 .NET 4 之上的 CTP,但这些 CTP 中存在明确的错误 - 不要使用它们。您应该使用 .NET 4.5 的完整发行版,其中包括 C# 5 编译器。 (所有这些都在 Visual Studio 2012 中。)

其次,正如 Cuong Le 所示,您使用了错误的任务属性。 Result 属性是您如何获得 Task<T> 的结果.

第三,更改后使用 Result属性,您将阻止获取表 - 使其毫无意义。这个:

public DataTable GetData(string sql, string connectionName)
{
    DataTable dt = (DataTable)GetDataAsync(sql, connectionName).Result;
    return dt;
}

...在很大程度上相当于:
public DataTable GetData(string sql, string connectionName)
{
    return FillData(sql, connectionName);
}

如果您要启动一个任务并立即等待它,您不妨同步调用该方法。

关于.net - 使用异步 .net 4.0 返回数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12595119/

相关文章:

.net - 在 XP Pro 上使用 WebBrowser 控件访问 Violation painting ToolStripComboBox

c# - 从单个字符串列请求 1..N 值时,QueryAsync() 返回什么?

c# - HttpClient (C#) 在许多异步请求上失败?

c# - 在单行语句中删除包含某个单词/字符串的数组中的元素

xamarin.ios - Xamarin.ios 的 AsyncBridge.portable

c# - 如何使用C#获取简单的指纹图像

.net - 启动 .NET 控制台应用程序时会发生什么?

.net - 如果断点 A 已被命中,则启用断点 B

C#4.0 : How to find out if types are co-variantly equal

c# - 协变/逆变 : how to make the following code compile