【发布时间】:2015-03-01 17:41:42
【问题描述】:
我正在尝试在我的 WPF 应用程序中集成第三方库。该库用于通过他/她的社会安全号码收集一个人的信用卡历史记录。它基本上提供了一个返回 void 的方法。一旦该方法完成,您就可以收集信用卡历史记录。
ThirdPartyLibrary Instance = new Instance(SSN);
Instance.Run(); // This method returns a void and it blocks until data retrieval completes
if ( Instance.Success )
CreditHistory History = Instance.CreditHistory;
现在我想针对人数同时运行此 API,但是,我还想设置一次最大请求数的阈值。如果达到该阈值,我想等待其中一个请求完成,然后再发送新请求。最后,我想在任何一个提交的请求成功或失败时更新我的 UI。
这是我的问题:
此第三方 API 可能最终会等待相当长的时间来收集信息。在这种情况下使用 TPL/PLINQ API 像
Parallel.ForEach或AsParallel是很好的选择吗?我可以使用
await/async来创建对第三方库的调用的包装器,因为它的 Run 方法返回一个 void?等待个人请求提交的最佳方法是什么,以便我可以不断更新我的 UI 以了解进度。
请就应该如何设计/实现它提供您的建议(以及一些示例代码)?我一直在阅读有关 Tasks 和 Async/Await 的大量内容,但对于这个用例的最佳模式可能是什么感到很困惑?
【问题讨论】:
-
感谢 Balm 的建议。这将用于使用生产者-消费者模式,对吧?如果是这样,我也读过它,但我不确定如何将它与这个第三方库集成,同时还能获得进展的更新。有什么想法吗?
-
我大部分时间都在阅读/使用较小的代码示例来理解这些概念。例如,我在几个地方读到 Parallel.ForEach 不适合任何执行 I/O 的操作。这个第三方 API 调用了一些用于数据检索的网络服务,所以我只是想了解在我的设计中应该真正使用哪种方法
-
@PaulSnow API 是
async? -
@PaulSnow 如果 API 被阻塞,那么您在这件事上别无选择,因为 API 不是
async。Parallel.Foreach、AsParallel、BlockingCollection和 TPL Dataflow 都是有效选项。
标签: c# wpf async-await task