【发布时间】:2014-08-19 04:41:25
【问题描述】:
所以情况如下:我需要调用一个开始搜索的网站。此搜索持续了未知的时间,我知道搜索是否完成的唯一方法是定期查询网站以查看其上是否有“下载数据”链接(它在 javascript 上使用了一些奇怪的 ajax 调用计时器来检查后端并更新页面,我认为)。
所以诀窍是:我需要搜索数百个项目,一次一个。所以我有一些看起来有点像这样的代码:
var items = getItems();
Parallel.ForEach(items, item =>
{
startSearch(item);
var finished = isSearchFinished(item);
while(finished == false)
{
finished = isSearchFinished(item); //<--- How do I delay this action 30 Secs?
}
downloadData(item);
}
现在,显然这不是真正的代码,因为可能有一些事情导致isSearchFinished 始终为false。
除了明显的无限循环危险之外,我如何正确地阻止 isSearchFinished() 一遍又一遍地调用,而是每隔 30 秒或 1 分钟调用一次?
我知道Thread.Sleep() 不是正确的解决方案,我认为该解决方案可以通过使用Threading.Timer() 来完成,但我对它不是很熟悉,而且线程选项太多了,我只是不确定使用哪个。
【问题讨论】:
-
我认为你不应该使用
Parallel.ForEach -
好的,我应该使用什么?我非常愿意接受建议。
-
所以只需使用 foreach 循环,例如,任务工厂?
-
是的,对于在特定时间长度后安排的定期操作,
Timer正是您想要的。 -
您对使用 Thread.Sleep 的担忧是您将固定其中一个线程池线程?使用 Task.Delay 而不是 Tasks 的异步方法怎么样?
标签: c# multithreading task-parallel-library parallel.foreach