1

我有一个应用程序,我需要在其中通过服务查询共享点站点。该应用程序将被大量使用,因此性能和可扩展性将是我的两个优先事项。

我开始研究哪种服务方法更好,从性能的角度来看,似乎客户端对象模型是官方建议的,但是当我谈到可伸缩性时,我个人发现实际上 Web 服务似乎比客户端对象模型更有效。这是因为 Web 服务似乎对 IO 绑定操作具有异步支持,而不是客户端对象模型支持。我说不是,因为正如Stephen Toub所说,异步调用同步方法的能力对可伸缩性没有任何作用,我认为 BeginInvoke 就是这样做的。

我不得不提一下,我在我的应用程序中使用 C# 5 async/await 功能,以便在服务器上执行查询时将线程返回到线程池。

我的问题是,为了做出决定,应该更重视什么?

编辑:值得一提的是,我没有使用 Silverlight CSOM,我使用的是更通用的 .NET。

4

2 回答 2

2

这是一个没有答案的答案。:)

您是正确的,因为它BeginInvoke是假异步的(即,它只是在线程池线程上发出阻塞调用)。因此,在可扩展性方面,它实际上比仅仅调用阻塞方法更糟糕。

首先,与您的 Sharepoint 服务器相比,考虑您的可伸缩性。如果您在大致相同的硬件上运行,那么您可能不需要比 Sharepoint 服务器进行更多的扩展。两种解决方案都可以。

如果您确实需要更好地扩展(例如,Sharepoint 服务器是集群或云,或者如果您的机器比 Sharepoint 机器小得多),那么它需要更多的思考和可能的测试。

客户端模型中更好的性能纯粹来自其批处理功能。因此,如果您的应用程序不使用批处理,那么(异步)Web 服务模型会更好。

但是,如果您的应用程序使用批处理并且需要更好地扩展,那么就没有答案了。在这种情况下,唯一知道的方法是双向构建测试用例并对其进行测量。

于 2013-07-24T14:33:04.460 回答
0

实际上,客户端对象模型不仅提供,有时还需要异步访问。您可以在数据检索概述中找到更多信息,但简短的版本是:

  1. 然后在 ClientRuntimeContext 中创建并加载一个或多个查询
  2. 使用 ClientRuntimeContext.ExecuteQuery同步执行所有加载的查询,或者使用ClientRuntimeContext.ExecuteQueryAsync异步执行所有加载的查询,使用两个回调来判断成功或失败

您不必在任何地方使用 BeginInvoke。

事实上,Silverlight 中的 Client 对象模型仅提供 Async 方法,在这种情况下,您被迫异步执行调用。

语法很古怪,但客户端对象模型以 .NET 3.5 和 Silverlight 为目标,因此无法提供基于任务的接口。您甚至可以争辩说,回调比 Begin/End 模式更简单,而且肯定比引发完成事件更好。

编辑

正如@alexb 所注意到的,ExecuteQueryAsync 仅在 Silverlight 中可用。不过,还有其他异步工作方式。

您可以利用 Sharepoint 的 OData 支持来使用 WCF 数据服务查询列表。查询场景有点类似,当您提交查询并在结果到来时等待回调。同时,您可以访问表示异步查询的 DataServiceQuery 对象。

此方法使用 REST/Json,因此在网络上比 Web 服务更轻。与 Web 服务相比,LINQ 和类似 ORM 的 API 也更易于使用。

Sharepoint 的支持在使用 ADO.NET 数据服务查询 SharePoint Foundation 中进行了描述,异步查询在如何:执行异步数据服务查询(WCF 数据服务)中进行了描述

于 2013-07-25T13:34:36.180 回答