我在forloop中传递标签列表以进行迭代,但是它引发了ConcurrentModificationException
private List<string> urls = //fetch from db;
ManualResetEvent waitEvent = new ManualResetEvent(false);
BrowserView webView = new WPFBrowserView();
string path = //my local path;
public MainWindow()
{
InitializeComponent();
mainLayout.Children.Add((UIElement)webView.GetComponent());
webView.Browser.FinishLoadingFrameEvent += delegate (object sender, FinishLoadingEventArgs e)
{
System.Threading.Thread.Sleep(5000);
if (e.IsMainFrame)
{
DOMDocument document = e.Browser.GetDocument();
var html = document.DocumentElement.InnerHTML;
System.IO.File.WriteAllText(path, html);
waitEvent.Set();
}
};
foreach (var url in urls)
{
webView.Browser.LoadURL(url);
waitEvent.WaitOne();
waitEvent.Reset();
}
}
答案 0 :(得分:1)
这是因为在迭代数组时不允许删除和添加操作。因此,您需要存储要在不同数组中删除的所有元素,然后立即删除它们。这是一个例子:
public void clearTag() {
List<Tag> tags = binding.search.tagView.getTags();
List<Tag> tagsToRemove = new ArrayList<>();
Log.d(TAG, "clearTags: " + tags);
for (Tag tag : tags) {
Log.d(TAG, "clearTag: " + tag + " " + tag.getLayoutColor());
if (tag.getLayoutColor() == R.color.red) {
tagsToRemove.add(tag);
} else if (tag.getLayoutColor() == R.color.blue) {
tagsToRemove.add(tag);
} else if (tag.getLayoutColor() == R.color.green) {
tagsToRemove.add(tag);
}
}
tags.removeAll(tagsToRemove);
updateTagVisibility();
//resetFilter();
}
答案 1 :(得分:0)
如果您将每个循环更改为“正常”&#39;对于循环,与(int = 0; i&lt; size; i ++)一样,它可能有效。确保每次删除元素时都必须将一个元素移回i - ;
答案 2 :(得分:0)
我最近遇到过这个例外。当您尝试修改已在使用/迭代的集合时,会发生这种情况。
您的每个循环从Tag
列表中选择一个tags
对象,并在循环内从同一列表中删除该对象。这在Java中是不允许的。
您可以像这样更改代码:
public void clearTag(){
List<Tag> tags = binding.search.tagView.getTags();
// Create a dummy arrayList to store the tags to remove
List<Tag> removedTags = new ArrayList<Tag>();
Log.d(TAG, "clearTags: " + tags);
for (Tag tag : tags) {
Log.d(TAG, "clearTag: " + tag + " " + tag.getLayoutColor());
if (tag.getLayoutColor() == R.color.red) {
removedTags.add(tag);
} else if (tag.getLayoutColor() == R.color.blue) {
removedTags.add(tag);
} else if (tag.getLayoutColor() == R.color.green) {
removedTags.add(tag);
}
}
// remove the tags
tags.removeAll(removedTags)
updateTagVisibility();
//resetFilter();
}