【问题标题】:Async web service异步网络服务
【发布时间】:2013-12-26 20:43:54
【问题描述】:

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

[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 服务调用以使用这个新的 Async 方法?

【问题讨论】:

  • 与您的问题没有直接关系,但您可以删除 sqlRdr.Close();sqlConn.Close(); 行,因为您的 using 语句会自动处理这些行。
  • 我从您的标题中删除了“C#”,因为无论服务是用什么语言编写的 - 都会有同样的问题。

标签: c# .net web-services asynchronous


【解决方案1】:

你可以这样重写:

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

此外,我在GetMeSomeNumbers&lt;T&gt; 中看不到任何泛型类型参数的用法,所以我假设您可以删除它。

【讨论】:

  • 糟糕,正在复制和粘贴代码。忘记删除泛型,谢谢。
  • 如果我们这样写会有什么变化? (假设 OP 用return DB.GetMeSomeNumbers().Result 更正了他的代码)
  • @L.B,不同之处在于当我们使用var temp = someTask.Result;而不是var temp = await someTask;时,它将阻塞调用线程,直到任务完成并准备好返回其结果。但是如果你使用await,线程不会被阻塞,同时可以做一些其他的工作。 1, 2
  • @Yuriy ... and could do some other job in the meantime 但是 Web 服务方法 GetSomeDatabaseNumbers 除了等待结果并返回它之外什么都没有做。它不是 UI 代码。它是一种服务器方法(由其容器以多线程方式处理),必须评估参数并返回结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多