Индикатор выполнения на неизвестное время процесса - PullRequest
6 голосов
/ 15 июня 2011

Я разрабатываю winform (c #), которая запускает / останавливает / перезапускает службы Windows.Я хочу поставить индикатор выполнения, пока действие не будет завершено.Я новичок в программировании .net.Пожалуйста, помогите мне добиться этого.

Ответы [ 3 ]

9 голосов
/ 15 июня 2011

Вы не можете показать значимый прогресс, если вы не знаете, сколько времени это займет. Вы не можете знать, что запуск службы занимает от 1 до 30 секунд. Все, что вы можете сделать, это показать пользователю индикатор «Я не умер, работаю над этим». ProgressBar поддерживает это, установите для свойства Style значение «Marquee».

Вам также нужно будет запустить службу в рабочем потоке, чтобы избежать зависания вашего пользовательского интерфейса. Это лучше всего сделать с помощью 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 голос
/ 15 июня 2011

Вы имеете в виду, что вы хотите запустить / перезапустить / остановить более одной службы и хотите, чтобы индикатор выполнения отображал «как далеко вы обработали список служб, которые нужно запустить / перезапустить / остановить»?Вы можете сделать что-то вроде:

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. до тех пор, пока не будет обнаружен тайм-аут (вам нужно найти разумное количество секунд, чтобы служба перешла в нужное состояние)

Кажется, это единственный путь.

1 голос
/ 15 июня 2011

Вы должны разделить процесс запуска / остановки / перезапуска на маленькие части, и после того, как часть будет завершена, вы устанавливаете индикатор выполнения.
Для мгновенного обновления вам необходимо ознакомиться с методами, которые вы выполняете, чтобы получить обратную связьего статус.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...