我有一个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。
答案 0 :(得分:0)
“Task.Factory.StartNew”需要多长时间? (如果这是同步的)
如果上面的lambda表达式是异步的,我看看renameTask.Result.Count是否大于0,进度条= false ......
答案 1 :(得分:0)
修改强> 从评论中得出一个想法 - 似乎你根本不需要计时器。
您可以在更新Value
的值时更新进度条progress
。
那样从0到100%的过渡也可能看起来更顺畅。
根据我的说法你需要禁用计时器。
只需使用
timer.Stop();
然后再次需要timer.Start()
。
此外,如果您已停用计时器进度,那么您还必须
timerUpdateProgress.Enabled = true