将 Azure-Search-Client-Library 与并行任务结合使用
Using the Azure-Search-Client-Library with parallel tasks
我正在使用 Azure Search Client Library,我想使用不同的查询参数并行调用查询多次。当我尝试这个时,我得到了异常:
"Collection was modified; enumeration operation may not execute."
我通过在调用前添加一个 SemaphoreSlim 对象来解决这个问题,这可以防止多个线程同时执行查询。但是,此解决方案会使执行时间加倍。
private static readonly SemaphoreSlim syncLock = new SemaphoreSlim(1);
....
await syncLock.WaitAsync();
result = await SearchClient.Indexes[IndexName].QueryAsync<MyIndex>(queryParams);
syncLock.Release();
既然每个查询都是一个独立的调用,我假设线程应该不会相互影响?
在这些门的后面,有一个通用的可枚举对象,它列出了在服务中创建的索引。如果您尝试检索的索引的内存中没有引用,将在代表您获取索引的统计信息、模式和一些其他属性后创建一个引用,对用户完全透明。但是,这个操作,如果在另一个线程上并行执行多次,就会抛出这个异常。
非常感谢您的反馈,我尝试尽快更新库并相应地处理这种情况。在那之前(我怀疑这可能需要几天时间),请继续使用你的 Semaphore 解决方案,效果很好。
再次感谢!
亚历克斯
我正在使用 Azure Search Client Library,我想使用不同的查询参数并行调用查询多次。当我尝试这个时,我得到了异常:
"Collection was modified; enumeration operation may not execute."
我通过在调用前添加一个 SemaphoreSlim 对象来解决这个问题,这可以防止多个线程同时执行查询。但是,此解决方案会使执行时间加倍。
private static readonly SemaphoreSlim syncLock = new SemaphoreSlim(1);
....
await syncLock.WaitAsync();
result = await SearchClient.Indexes[IndexName].QueryAsync<MyIndex>(queryParams);
syncLock.Release();
既然每个查询都是一个独立的调用,我假设线程应该不会相互影响?
在这些门的后面,有一个通用的可枚举对象,它列出了在服务中创建的索引。如果您尝试检索的索引的内存中没有引用,将在代表您获取索引的统计信息、模式和一些其他属性后创建一个引用,对用户完全透明。但是,这个操作,如果在另一个线程上并行执行多次,就会抛出这个异常。 非常感谢您的反馈,我尝试尽快更新库并相应地处理这种情况。在那之前(我怀疑这可能需要几天时间),请继续使用你的 Semaphore 解决方案,效果很好。 再次感谢! 亚历克斯