我正在开发一个连接到Sharepoint以检索数据的服务。我想让它尽可能地异步。
但是,与标准.NET一起使用的Client Components SDK Microsoft.Sharepoint.Client
似乎没有任何异步功能。一个恰当的例子是ExecuteQuery
函数,它有一个重载ExecuteQueryAsync
,但只能在Microsoft.SharePoint.Client.Silverlight.dll
或Microsoft.SharePoint.Client.Phone.dll
中找到documentation个状态。
有什么办法以某种方式访问这个异步功能吗?我不确定我是否可以尝试在我的代码中直接使用Silverlight DLL,或者如果这会在以后出现问题。很确定它会。是否有其他API可以让我做我想做的事情?
答案 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);
。