【发布时间】:2015-01-09 17:16:09
【问题描述】:
我正在使用 c# 和 Visual Studio 2010 制作一个 Word 插件。
我做了一个简单的测试代码来接受所有的文档修订如下:
if (CurrentDocument.Revisions.Count > 0)
{
Project.LoadingWindow.LoadingWindow loadingWindow =
new LoadingWindow.LoadingWindow("Updating...");
loadingWindow.ProgressBarVisibility = Visibility.Collapsed;
System.Windows.Threading.Dispatcher loadingWindowDispatcher =
loadingWindow.Dispatcher;
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = false;
worker.WorkerSupportsCancellation = false;
worker.DoWork += delegate
{
List<Revision> revisions = new List<Revision>();
int count = 0;
foreach (Revision rev in CurrentDocument.Revisions)
{
count++;
revisions.Add(rev);
}
AcceptRevisions(revisions, loadingWindowDispatcher, loadingWindow);
worker.Dispose();
worker = null;
};
worker.RunWorkerAsync();
loadingWindow.Show();
}
如果我在 foreach 之后放置断点,调试将无法到达。
CurrentDocument.Revisions.Count 为 618
但是使用 int 计数器,我可以看到计数轻松达到 9000!
我做错了什么?我对 Visual Studio 和 C# 有点陌生,但我似乎无法弄清楚可能发生了什么。
【问题讨论】:
-
很抱歉,但这是不可能的。
foreach是确定性的。 -
抱歉,添加了计数器。
-
@PatrickHofman:如果您枚举的集合在您枚举时被修改,那么所有的赌注都会被取消。如果是这种情况,我们无法从代码中分辨出来,但我已经看到
foreach没有终止的循环。 -
@JeroenMostert,正在使用
foreach,这意味着将抛出Collection was modified; enumeration operation may not execute.。 -
@Patrick Hofman, @Idle_Mind:当且仅当集合实际实现了检测这一点的逻辑时才有效,即使这样,它也仅在特定情况下有效。例如,
List<T>将可靠地检测来自单个线程的修改,因为它维护了一个版本计数器,但如果您从多个线程修改同一个实例,这不一定有效。
标签: c# visual-studio-2010 foreach ms-word add-in