【发布时间】:2012-10-10 05:48:04
【问题描述】:
我有多个线程访问一个方法。
该方法会在线程执行时更新表单上的进度条。
该方法会更新我的 windows 窗体上的进度条,以显示线程正在完成处理文件的进度。
您将如何管理该方法以避免死锁。我无法锁定它,不知道是我做错了,还是在这种情况下我应该锁定它。
public void myWorkerClass()
{
int amountToScan = 4;
lblcount.BeginInvoke(
((Action)(() => lblcount.Text = "Files Checked " + atPDFNumber.ToString() + " of " + amountToScan.ToString())));
decimal percentageComplete = ((decimal)atPDFNumber / (decimal)amountToScan) * 100;
backgroundWorker1.ReportProgress((int)percentageComplete);
}
发生的情况是,在最后一行,它告诉我“这个操作已经调用了 OperationCompleted 并且进一步的调用是非法的。”
我认为我打开了已经由第一个线程或类似的东西处理的东西。
这是在多线程中使用进度条的好方法(我的想法或原则是否正确),还是我的代码中只是一个小错误?
我想让这个问题对其他人有价值的方法是回答这个问题,如何在多个线程访问的方法中访问全局变量。 因为我认为这就是这个问题的方向。
【问题讨论】:
-
我认为您需要为进度条对象创建一个委托,就像您有多个线程更新表单中的列表框一样。
-
您正在对不再执行任何工作的后台工作人员调用 ReportProgress。使用对 backgroundWorker1 的硬引用并且拥有多个线程永远不会正确。
-
所以你说拥有多个主题不是一个好主意?为什么不?和@Derek,现在正在查找代表
标签: c# multithreading methods progress-bar