我正在开发winform(c#),用于启动/停止/重新启动Windows服务。我想要放置一个进度条,直到动作完成。我是.net编程新手。请帮助我实现这一目标。未知进程时间的进度条
4
A
回答
7
当你不知道需要多长时间时,你不能显示有意义的进展。您无法知道,服务需要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");
}
}
1
您必须将小部件的开始/停止/重新启动进度分开,并在部件完成后设置进度条。
对于即时更新,您需要了解执行的方法以获取有关其状态的反馈。
1
您的意思是说您想要启动/重新启动/停止多个服务,并且希望进度条指示“您已处理了要启动/重新启动/停止的服务列表多少”?你可以这样做:
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似乎做的是:
- 它试图启动/重新启动/停止该服务
- 它调用
ServiceController.WaitForStatus
有1秒超时,看服务是否已经进入相应的状态 - 增加1进度条值,直到超时被检测去2.(你需要找几秒钟内合理数量的等待服务进入理想状态)
这似乎是唯一的办法。
相关问题
- 1. 进度条未显示进度条
- 2. 进度条与UTC时间
- 3. 实现引导进度条来通知用户课程进度
- 4. r和系统时间的进度条
- 5. 估计进度条的循环时间
- 6. AVPlayer的时间轴进度条
- 7. 使用Theme.NoTitleBar时未显示进度条
- 8. 进度条未及时更新
- 9. 进度条并未停止
- 10. WPF进度条未显示
- 11. 只用时间戳创建进度条?
- 12. WPF - 根据时间动画进度条
- 13. 长时间运行的进程在WCF中的进度通知 - 如何?
- 14. 下载时的进度条
- 15. 未知运行时间剩余的配置进程
- 16. javafx:进度条显示进程的进度?
- 17. 减慢进度条进度
- 18. 设置进度,进度条
- 19. 进度条更新进度
- 20. 带进度条的长时间运行过程示例PlayFramework 2
- 21. 进度条为每个进程
- 22. JSF进度条 - 服务器端进程
- 23. 以编程方式创建时未显示Android进度条
- 24. 如何拆分多进程同时发生的进度条
- 25. WPF实时进度条
- 26. jQuery倒计时进度条
- 27. 进度条和计时器
- 28. 进度条不知道任务数
- 29. 如何在时间进度条中放置时间显示框
- 30. 进度条宽度
当我使用此代码,我得到 – Gokul 2011-06-15 12:45:56
从工具箱BackgroundWorker组件到窗体“backgroundWorker1不会在当前的背景下存在”。在属性窗口中设置事件处理程序,闪电图标。 – 2011-06-15 12:52:22
非常感谢回复,进程栏即将到来,但是两者都没有开始。我用编码 – Gokul 2011-06-15 13:01:54