【发布时间】:2011-05-10 09:35:58
【问题描述】:
我正在使用 BackgroundWorker,在其中我正在使用 foreach 循环,在其中我创建新线程,等待它完成,然后报告进度并继续 foreach 循环。这就是我要说的:
private void DoWork(object sender, DoWorkEventArgs e) {
var fileCounter = Convert.ToDecimal(fileNames.Count());
decimal i = 0;
foreach (var file in fileNames) {
i++;
var generator = new Generator(assembly);
var thread = new Thread(new ThreadStart(
delegate() {
generator.Generate(file);
}));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
while (thread.IsAlive); // critical point
int progress = Convert.ToInt32(Math.Round(i / fileCounter * 100));
backgroundWorker.ReportProgress(progress);
}
}
问题是线程完成后(通过“临界点”行之后)内存没有被释放。我认为当线程不活跃时,与它相关的所有资源都会被释放。但显然这不是真的。 谁能向我解释为什么以及我做错了什么。 谢谢。
【问题讨论】:
-
如果要等待它完成,为什么要使用单独的线程?只需在主线程中生成即可。
-
@Dani 我不能,因为在 Generate 中引发了异常:“调用线程必须是 STA,因为许多 UI 组件都需要这个......”这就是我创建线程并将 ApartmentState 明确设置为 STA 的原因.
标签: c# multithreading backgroundworker