我有以下场景算法 将特定文件复制到磁盘中的所有驱动器
Copyfile()
{
for(int i=0;i<drivesnumber;i++)
{
t = new Thread(() => MoveProgressBarwhilecopying()
t.joint()
}
}
MoveProgressBarwhilecopying()
{
DoCopy
if(progressbar1.InvokeRequired)
CopyingprogressBar.Invoke(new MethodInvoker(() => { CopyingprogressBar.Increment(1); }))
}
我的问题是我在所有磁盘上复制文件,我想要一个且只有一个进度条来处理这个操作
并且因为在循环中运行的所有线程都不需要重叠的联合操作
我无法调用进度条 ,任何建议请运行具有相同进度条和联合操作的多个线程
答案 0 :(得分:0)
你的进度条可能在一个线程(UI线程)中运行,然后你可以让其他线程完成他们必须做的工作(工作线程)。
如果是这样,你必须要知道做这项工作的线程几乎可以在同一时间完成,例如相隔1ms,并要求进度条增加1.可能发生的情况是,当您要求它再次从另一个线程增加时,进度条仍处于增加的过程中。保存计数的变量可能尚未更新。这会导致各种不需要的行为,并发问题。范围从显示问题到崩溃和死锁。也可能是你的工作线程占用了大量的CPU时间,因此UI线程没有足够的CPU时间来及时刷新进度条。
因此,您的问题的解决方案可能是您必须保护您的进度条不被同时访问。您可以使用显示器,互斥锁,信号量甚至插座来实现。根据您的特定目标,某些人可能比其他人更适合。 另一部分是确保UI线程有足够的时间刷新进度条,而其他线程声称CPU时间来完成他们的工作。