【问题标题】:Progress Bar for unknown process time未知处理时间的进度条
【发布时间】:2011-06-15 11:25:07
【问题描述】:

我正在开发启动/停止/重新启动 Windows 服务的 winform(c#)。我想放一个进度条,直到动作完成。我是.net 编程的新手。请帮助我实现这一目标。

【问题讨论】:

    标签: winforms progress-bar


    【解决方案1】:

    当您不知道需要多长时间时,您无法显示有意义的进步。你不知道,服务需要 1 到 30 秒才能启动。您所能做的就是向用户显示“我还没死,正在处理它”的指示符。 ProgressBar 支持,将 Style 属性设置为“Marquee”。

    您还需要在工作线程中启动该服务,以避免您的 UI 冻结。最好使用 BackgroundWorker 来完成。让它看起来像这样:

    public partial class Form1 : Form {
        public Form1() {
            InitializeComponent();
            ServiceProgressBar.Style = ProgressBarStyle.Marquee;
            ServiceProgressBar.Visible = false;
        }
    
        private void StartButton_Click(object sender, EventArgs e) {
            this.StartButton.Enabled = false;
            this.ServiceProgressBar.Visible = true;
            this.backgroundWorker1.RunWorkerAsync("foo");
        }
    
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
            var ctl = new ServiceController((string)e.Argument);
            ctl.Start();
        }
    
        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
            this.StartButton.Enabled = true;
            this.ServiceProgressBar.Visible = false;
            if (e.Error != null) {
                MessageBox.Show(e.Error.ToString(), "Could not start service");
            }
        }
    

    【讨论】:

    • 当我使用这段代码时,我得到“backgroundWorker1 在当前上下文中不存在”
    • 将 BackgroundWorker 组件从工具箱拖放到表单上。设置其事件处理程序,属性窗口中的闪电图标。
    • 非常感谢您的回复,进程栏即将出现,但都没有开始。我已经用代码编辑了问题
    • 听起来就像您刚刚输入了事件处理程序。您是否使用了闪电图标?练习一下如何为控件编写事件处理程序。
    • 谢谢汉斯,它成功了!我没有点击事件处理程序。
    【解决方案2】:

    您必须将启动/停止/重启进度分成小部分,并在部分完成后设置进度条。
    对于即时更新,您需要进入正在执行的方法以获取有关其状态的反馈。

    【讨论】:

      【解决方案3】:

      您的意思是要启动/重新启动/停止多个服务并希望进度条显示“您已处理要启动/重新启动/停止的服务列表的程度”?你可以这样做:

      progressBar.Maximum = listOfServicesToStart.Count;
      progressBar.Value = 0;
      
      for (int i = 0; i < listOfServicesToStart.Count; i++)
      {
          // Start service listOfServicesToStart[i]
          progressBar.Value = i;
          Application.DoEvents();
      }
      

      如果您打算可视化服务的启动过程:我想您不能很好地做到这一点。 Windows 中的服务管理单元似乎做的是:

      1. 它尝试启动/重新启动/停止服务
      2. 调用ServiceController.WaitForStatus,超时1秒,查看服务是否进入相应状态
      3. 将进度条值加一并变为2。直到检测到超时(您需要找到合理的秒数来等待服务进入所需状态)

      这似乎是唯一的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多