【发布时间】:2012-06-18 09:31:16
【问题描述】:
我有一个带有接口的库。
Public Interface Progress
{
int ProgressValue{get;set;},
string ProgressText{get;set;},
}
库有一个方法 Create(虚拟代码):
Public Class TestLibrary
{
Progress _progress;
Public void Create()
{
foreach(var n in TestList)
{
// Do Something
_progress.ProgressValue = GetIndex(n);
_progress.ProgressText = "Updating..." + n;
}
}
}
我有一个引用这个库并调用 Create 方法的项目。它甚至实现了接口进度。
Public Class TestProject : Progress
{
public int ProgressValue
{
get{return progressBar1.Value;}
set{progressBar1.Value = value;}
}
public int ProgressText
{
get{return label1.Text;}
set{label1.Text = value;}
}
}
现在,当我运行应用程序时,进度条正常运行并正确显示进度,但 label1 的文本根本没有改变。但它确实在 for 循环结束时发生了变化,并显示了循环中的最后一项。谁能帮我解决这个问题?
注意:所有这些代码都是直接编写的,没有经过测试,因为我现在没有我的应用程序。很抱歉有任何语法错误。
【问题讨论】:
-
出于兴趣完成时它会改变吗?如果是这样,这可能只是线程问题 - 看起来您在 UI 线程中做了太多工作。
-
@JonSkeet:是的,它确实发生了变化。我编辑了问题以反映相同的情况。
-
这肯定是线程问题 - 确保您的“进度”-代码不在 UI 线程上运行
-
实际的业务逻辑需要多长时间?如果花费的时间非常少,那么标签更新不会反映在 UI 中(我现在与 backgroundworker 面临类似的事情)。另一方面,如果花费的时间太长,请尝试在每次工作迭代之间休息一下。正如乔恩所说,不要在 UI 线程上做。使用 BackGroundWorker 线程。
标签: c# winforms progress-bar uilabel