отменить процесс, нажав кнопку - PullRequest
2 голосов
/ 06 января 2012

В проекте, который я написал, есть процесс.Это занимает время, и я хочу использовать индикатор выполнения.Я хочу, чтобы пользователь мог отменить процесс и ProgressBar, нажав кнопку.Я не хочу, чтобы пользователь мог нажимать какие-либо другие элементы управления в этой форме, когда мой процесс запущен.Если я использую нить, то пользователь может щелкнуть другие элементы управления в форме.

Возможно, одним из решений является использование другой формы, а также установить ProgressBar и кнопку отмены на второй форме.Но как я могу установить значение ProgressBar в соответствии с моим процессом, который принимает участие в first форме.

Какое решение?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 06 января 2012

Лучше всего это сделать с помощью диалогового окна, которое автоматически делает остальную часть вашего интерфейса недоступной. Добавьте новую форму в ваш проект и поместите ProgressBar и кнопку на него. И добавьте публичный метод, чтобы вы могли обновить индикатор выполнения из обработчика событий в основной форме:

public partial class ProgressDialog : Form {
    public ProgressDialog() {
        InitializeComponent();
    }
    public void ShowProgress(int progress) {
        progressBar1.Value = progress;
    }
    private void CancelProcess_Click(object sender, EventArgs e) {
        this.DialogResult = DialogResult.Cancel;
    }
}

Вам нужно будет отобразить диалоговое окно при запуске работника:

    ProgressDialog dlg;

    private void RunProcess_Click(object sender, EventArgs e) {
        backgroundWorker1.RunWorkerAsync();
        using (dlg = new ProgressDialog()) {
            dlg.ShowDialog(this);
        }
        dlg = null;
        if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();
    }

Обратите внимание, как он вызывает метод CancelAsync (), чтобы остановить работника, поэтому закрытие диалога достаточно для его остановки. Вам нужно будет обновить индикатор выполнения:

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
        dlg.ShowProgress(e.ProgressPercentage);
    }

И вам нужно автоматически закрыть диалоговое окно, когда работник завершит работу, а пользователь сам не закроет диалоговое окно:

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        if (dlg != null) dlg.Close();
    }
2 голосов
/ 06 января 2012

Используйте BackgroundWorker, это предоставляет API для сообщения о прогрессе и отмене.

1 голос
/ 06 января 2012

Используйте BackgroundWorker для этого.Добавьте его в свою первую форму, и в BackgroundWorker значение индикатора прогресса изменения события будет изменено.Посмотрите на пример, показанный в документации.

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