我可以在没有Silverlight的情况下访问ExecuteQueryAsync吗?

时间:2014-09-03 08:38:05

标签: c# silverlight sharepoint

我正在开发一个连接到Sharepoint以检索数据的服务。我想让它尽可能地异步。

但是,与标准.NET一起使用的Client Components SDK Microsoft.Sharepoint.Client似乎没有任何异步功能。一个恰当的例子是ExecuteQuery函数,它有一个重载ExecuteQueryAsync,但只能在Microsoft.SharePoint.Client.Silverlight.dllMicrosoft.SharePoint.Client.Phone.dll中找到documentation个状态。

有什么办法以某种方式访问​​这个异步功能吗?我不确定我是否可以尝试在我的代码中直接使用Silverlight DLL,或者如果这会在以后出现问题。很确定它会。是否有其他API可以让我做我想做的事情?

3 个答案:

答案 0 :(得分:0)

您可以使用TaskCompletionSource

创建一个包装器,使此任务异步

包装此

public override void ExecuteQueryAsync(
    ClientRequestSucceededEventHandler succeededCallback,
    ClientRequestFailedEventHandler failedCallback
)

您将此作为扩展方法提供:

public static class ClientExtension
{
  public static async Task<bool> ExecuteQueryAsync(this ClientContext ctx)
  {
     TaskCompletionSource<bool> tcs = new TaskCompletionSource<bool>();
     ctx.ExecuteQueryAsync(
        (s, e) => t.SetResult(true),
        (s, e) => t.SetException(e.Exception));
     return tcs.Task;
  }
}

要拨打此电话,您可以申请

await client.ExecuteQueryAsync();

答案 1 :(得分:0)

我一直在寻找相同的东西,而我发现的只是扩展方法 https://www.codeproject.com/articles/738008/programming-efficiently-with-the-sharepoint-client#async

public static class CSOMExtensions
{
    public static Task ExecuteQueryAsync(this ClientContext clientContext)
    {
        return Task.Factory.StartNew(() =>
        {
            clientContext.ExecuteQuery();
        });
    }
}

答案 2 :(得分:0)

SharePoint Online CSOM程序集现已更新,包括ExecuteQueryAsync。但是,没有一个适用于内部部署(2013、2016或2019)。

我有一个公开要点,其中包含ExecuteQueryAsync的实现:https://gist.github.com/johnnycardy/9e1671cf5087dcd8f4e7892fc3c2cfb8

然后您可以执行clientContext.ExecuteQuery(),而不用调用await CSOM15ExecuteAsync(clientContext);