作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在从网站上抓取内容。我有一个async
方法,该方法以递归方式访问页面并从页面中抓取内容。在此递归函数中,我传递了HashSet
和List
。 List
用于收集所有页面的内容,而Hashset
用于存储已访问的链接,以便我们不再访问它们。此功能的相关部分如下:
public async Task ScrapeContentRecAsync(string uri, List<Content> allContent, HashSet<string> alreadyVisited) {
...
var pageHtml = await httpClient.GetStringAsync(uri);
alreadyVisited.Add(uri);
...
allContent.Add(someContent);
...
var newLinks = FindAllCrawlableLinks(pageHtml);
foreach(var newLink in newLinks) {
await ScrapeContentRecAsync(newLink, allContent, alreadyVisited);
}
}
allContent
列表中,新的链接也添加到
alreadyVisited
中。简单来说,它就是网页树的
preorder
DFS
。
SynchronizationContext
和默认的
TaskScheduler
,即
await
之后的代码将在线程池线程上执行。
最佳答案
Since, my continuations can be executed on any thread pool thread, there is a chance that different threads are handling the recursive calls and adding to both the list and hashset collection.
Will the changes made to the collections one thread pool thread visible to other threads?
await
为您插入适当的线程屏障。
Can there be concurrency issues in the above scenario?
If I would have launched multiple recursive calls in parallel (optimisation), then would I have surely needed a thread safe collection?
关于c# - 在以下情况下,我应该使用线程安全集合吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62340867/
我是一名优秀的程序员,十分优秀!