【发布时间】:2013-02-04 17:37:30
【问题描述】:
如果我在属性窗口中将其Enabled 属性设置为 true,那么我在表单中使用了一个 Windows.Forms.Timer,这是它唯一有效的时间。如果我将其禁用,则仅在需要时启用它,它不会打勾。
private void btnRename_Click(object sender, EventArgs e)
{
timerUpdateProgress.Enabled = true;
timerUpdateProgress.Start();
pbProgress.Maximum = clbFiles.CheckedItems.Count;
var renameTask = Task.Factory.StartNew(() => doRename(true, tbCurrentDirectory.Text, clbFiles.CheckedItems, rules));
if(renameTask.Result.Count > 0)
{
timerUpdateProgress.Enabled = false;
new ExceptionsWindow(renameTask.Result).ShowDialog();
}
timerUpdateProgress.Enabled = false;
loadFiles(tbCurrentDirectory.Text);
}
private void timerUpdateProgress_Tick(object sender, EventArgs e)
{
pbProgress.Value = progress; //I have a breakpoint on this line
}
我要做的就是用进度条显示操作的进度。启用和启动计时器什么都不做,滴答声永远不会发生。为什么会这样?
更新:在启用和启动计时器后添加 2000 毫秒的睡眠后单步执行代码显示它仍然没有计时(我在计时处理程序中有一个断点)。
更多说明:在属性窗口中启用计时器时,总是会调用刻度处理程序,而无需调用Start()。只需启用计时器,我的断点就会一直触发。我还应该注意,我使用的是 .NET 4。
【问题讨论】:
-
禁用/启用的原因是什么。为什么不在需要时停止/启动?
-
progress中的值是多少??更新了吗? -
您似乎没有给计时器太多时间来打勾。您使用的间隔是多少?在您上面的代码中,计时器将运行的唯一时间是大约 4-5 行代码,这可能是几毫秒。
-
@DavidLloydBrookes 他们做同样的事情:msdn.microsoft.com/en-us/library/…
-
@RobinMaben 是的,它正在更新。 @onemancat
doRename方法是一个循环,所以它应该有一些时间去做,特别是因为它涉及到 IO。即便如此,我尝试在其中添加一个Thread.Sleep()以在启用和启动它之后给它时间,但它仍然不起作用。