异步Web服务

时间:2013-12-26 20:43:54

标签: c# .net web-services asynchronous

假设我有一个非常简单的网络服务:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class SomeServices
{
    [OperationContract]
    [WebGet]
    public IEnumerable<int> GetSomeDatabaseNumbers()
    {
        return DB.GetMeSomeNumbers();
    }
}

DBGetMeSomeNumbers方法执行一些数据库检索。

我一直在阅读上面的内容会导致请求阻塞,而我们正在等待数据库检索数据,因此我希望使用.net 4.5中的新异步功能来摆脱这种阻塞在我们等待数据库返回时发出并处理更多请求。我已经通过数据库调用重写了这样:

public class DB {
    public static async Task<int[]> GetMeSomeNumbers()
    {
        List<int> rtnEntities = new List<int>();
        using (MySqlConnection sqlConn = new MySqlConnection(Settings.ConnectionString))
        {
            MySqlCommand sqlCmd = new MySqlCommand("SELECT number from SomeTable", sqlConn);
            sqlConn.Open();
            using (MySqlDataReader sqlRdr = await sqlCmd.ExecuteReaderAsync())
            {
                while (sqlRdr.Read())
                {
                    rtnEntities.Add(sqlRdr.GetInt32(0));
                }
                sqlRdr.Close();
            }
            sqlConn.Close();
        }
        return rtnEntities.ToArray();
    }
}

如何修改我的Web服务调用以使用这种新的异步方法?

1 个答案:

答案 0 :(得分:2)

你可以这样重写:

public async Task<IEnumerable<int>> GetSomeDatabaseNumbers()
{
    return await DB.GetMeSomeNumbers();
}

此外,我在GetMeSomeNumbers<T>中看不到泛型类型参数的任何用法,因此我假设您可以删除它。