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

本文关键字:情况下 访问 ExecuteQueryAsync Silverlight 我可以 | 更新日期: 2023-09-27 18:20:37

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

但是,与标准.NET一起使用的客户端组件SDK Microsoft.Sharepoint.Client似乎没有任何异步功能。ExecuteQuery函数就是一个很好的例子,它确实有一个重载ExecuteQueryAsync,但正如文档所述,它只能在Microsoft.SharePoint.Client.Silverlight.dllMicrosoft.SharePoint.Client.Phone.dll中找到。

有什么方法可以访问这种异步功能吗?我不确定我是否可以直接在代码中使用Silverlight dll,或者这是否会在以后引起问题。很肯定会的。有没有其他API可以让我做我想做的事情?

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

您可以创建一个包装器,使用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();

我一直在寻找相同的方法,但我只找到了一个扩展方法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();
        });
    }
}

SharePoint Online CSOM程序集现已更新为包含ExecuteQueryAsync。然而,《现场直播》(2013年、2016年或2019年)没有。

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

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