定时奇怪的行为

时间:2013-02-04 06:51:40

标签: c# timer

我有一个Windows.Forms.Timer在一个表单中使用,如果我在属性窗口中将其Enabled属性设置为true,那就是它唯一有效的时间。如果我将其保留为禁用状态,则仅在需要时启用它,它不会打勾。

        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
        }

我要做的就是使用进度条显示操作的进度。启用和启动计时器什么都不做,勾号永远不会发生。为什么会这样?

更新:在启用并启动计时器后添加2000ms的睡眠后单步执行代码显示它仍然没有勾选(我在勾选处理程序中有一个断点)。

更多说明:当在属性窗口中启用计时器时,始终会调用tick处理程序,而不会调用Start()。只需启用计时器,我的断点就会一直触发。我还应该注意到我使用的是.NET 4。

2 个答案:

答案 0 :(得分:0)

“Task.Factory.StartNew”需要多长时间? (如果这是同步的)

如果上面的lambda表达式是异步的,我看看renameTask.Result.Count是否大于0,进度条= false ......

答案 1 :(得分:0)

修改 从评论中得出一个想法 - 似乎你根本不需要计时器

您可以在更新Value的值时更新进度条progress

那样从0到100%的过渡也可能看起来更顺畅。


根据我的说法你需要禁用计时器。

只需使用

timer.Stop();

然后再次需要timer.Start()

此外,如果您已停用计时器进度,那么您还必须

timerUpdateProgress.Enabled = true