当前位置:主页   - 电脑 - 网站开发 - ASP.Net
LINQ to SQL异步查询
来源:网络   作者:   更新时间:2012-08-02
收藏此页】    【字号    】    【打印】    【关闭

  异步操作是提高Web应用程序吞吐量的重要手段,关于这方面的话题已经在前文《正确使用异步操作》中解释过了。对于大多数互联网应用来说,性能瓶颈数据库访问。换句话说,一个请求在数据库操作上所花的时间往往是最多的——并且占总时间的90%以上。因此,当Web应用程序的吞吐量因为数据库操作的阻塞而受到影响的话,我们可是尝试使用异步数据库操作来进行优化。

  如果我们使用LINQ to SQL,在默认情况下是无法实现异步查询的,所有的操作都非常自然——异步是不自然的,因为它把连续的操作拆成了两段。如果理解了《在LINQ to SQL中使用Translate方法以及修改查询用SQL》一文中所提出的扩展方法,使用LINQ to SQL实现数据库的异步查询的方法应该就很容易想到了:借助SqlCommand对象来完成。

  在.NET中实现一个此类异步操作自然是按照标准的APM(Asynchronous Programming Model,异步编程模型)来开发一对Begin和End方法。按照APM进行开发其实不是一件非常容易的事情,不过在.NET 2.0里,尤其是在.NET 3.5中的某个特性,开发此类功能就变得容易一些了——也就是说,这是个在.NET 1.x => .NET 2.0 => .NET 3.5的演变过程中都得到改进的特性,猜出来是什么了吗?没错,这个特性就是“匿名方法”。

  匿名方法事实上基于委托,有了匿名方法这个特性,在一些本该使用委托的地方就可以直接定义一个函数了。这种做法在很多时候能够减少相当程度的代码量,尤其是本来很难省去的一些“条条框框”。例如,我们现在需要对一个Article列表按评论数量进行排序,并且在排序时可以指定升序或降序。如果没有匿名方法,我们一般会这么做:

public void SortByCommentCount(List<Article> articleList, bool ascending)
{
  // use the overloaded method: List<T>.Sort(Comparison<T> compare)
  ArticleComparison comparison = new ArticleComparison(ascending);
  articleList.Sort(new Comparison<Article>(comparison.Compare));
}
class ArticleComparison
{
  private bool m_ascending;
  public ArticleComparison(bool ascending)
  {
    this.m_ascending = ascending;
  }
  public int Compare(Article a, Article b)
  {
    return (a.CommentCount - b.CommentCount) * (this.m_ascending ? 1 : -1);
  }
}

  我们使用接受Comparison<T>作为参数的List<T>.Sort方法重载,如果没有特别的要求,我们只需写一个静态方法就可以了——只要方法签名符合Comparision<Article>就行了。可惜在这里,我们需要写一个额外的类,因为我们需要访问一个额外的参数ascending,而这个参数不能在一个独立的Comparision<Article>委托中获得。于是我们写了一个ArticleComparison类,它唯一的目的就是封装ascending。如果我们每次使用Sort功能都要封装一个类的话编写的代码也就太多了。但是如果我们有了匿名方法之后:

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明