Оповещение пользователя о запущенном процессе во время установки - PullRequest
0 голосов
/ 23 ноября 2011
protected override void OnBeforeInstall(IDictionary savedState)
{
    base.OnBeforeInstall(savedState);
    DialogResult result = DialogResult.None;
    if (isExcelIsRunning())
    {
        result = MessageBox.Show("Excel is still running. Please save your work and close Excel, and then click \"Retry\" button to continue with installation.", "", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning);
    }
    while (result == DialogResult.Retry)
    {
        if (!isExcelIsRunning())
        {
            break;
        }
    }
}


//check if excel is currently running
private bool isExcelIsRunning()
{
    bool flag = false;
    Process[] xlProc = Process.GetProcessesByName("excel");
    if (xlProc != null)
        flag = true;
    return flag;
}

Выше приведен код, который я собираюсь использовать для моего класса установщика.

Здесь я хочу добиться того, чтобы мне понадобился установщик, чтобы проверить, работает ли Excel в данный момент во время установки. И если он запущен, то в начале установки должно появиться всплывающее сообщение, предупреждающее пользователя о закрытии Excel, и установщик должен сделать паузу, пока в списке процессов больше не будет найден экземпляр Excel.

Возвращаясь к коду, я не думаю, что блок while является совершенно правильным, поскольку он может вызвать бесконечный цикл после того, как пользователь нажмет кнопку «Повторить», если в то же время Excel все еще работает.

Так что было бы лучше? Будет ли кто-нибудь здесь взглянуть на приведенный выше код и посмотреть, где я могу улучшить?

1 Ответ

1 голос
/ 23 ноября 2011

Я думаю, ваш код будет выглядеть примерно так:

while(isExcelRunning())
{
    var result = MessageBox.Show("Excel is still running. Please save your work and close Excel, and then click \"Retry\" button to continue with installation.", "", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning);
    if (result != DialogResult.Retry)
    {
         //Handle Cancel
         break;
    }
}

Это будет продолжать отображать предупреждение в цикле, либо до выхода из Excel, либо до нажатия кнопки «Отмена», когда вы можете делать все, что вам нужно; затем мы выходим из цикла (или вы можете полностью вернуться из метода).

Ключевым моментом здесь является повторное отображение предупреждения либо до тех пор, пока не исчезнет Excel, либо они решат отменить. Если вам нужно сделать некоторый код после цикла на основе ответа; возможно что-то вроде этого:

var userHasCancelled = false;
while(!userHasCancelled && isExcelRunning())
{
    var result = MessageBox.Show("Excel is still running. Please save your work and close Excel, and then click \"Retry\" button to continue with installation.", "", MessageBoxButtons.RetryCancel, MessageBoxIcon.Warning);
    if (result != DialogResult.Retry)
    {
         userHasCancelled = true;
    }
}
if (userHasCancelled)
{
    //User cancelled...
}
else
{
    //Continue.
}
...