C # WPF Выполнить действие, когда окно было создано - PullRequest
1 голос
/ 25 апреля 2011

Я открываю новое окно в отдельной теме. Я хочу, чтобы окно открылось, и задание запустилось автоматически, а затем сообщите о его ходе в это окно (я буду использовать индикатор выполнения).

Код действия, открывающий окно:

private void button_Run_Click(object sender, RoutedEventArgs e)
{
        ExecutorWindow myExecWindow = new ExecutorWindow();
        myExecWindow.Show();
}

Код окна:

public partial class ExecutorWindow : Window
{
    BackgroundWorker execBackground = new BackgroundWorker();

    public ExecutorWindow()
    {
        InitializeComponent();
        RunExecutor();
    }

    public void RunExecutor()
    {
        // CREATE BACKGROUNDWORKER FOR EXECUTOR
        execBackground.DoWork += new DoWorkEventHandler(execBackground_DoWork);
        execBackground.RunWorkerCompleted += new RunWorkerCompletedEventHandler(execBackground_RunWorkerCompleted);
        execBackground.WorkerReportsProgress = true;
        execBackground.WorkerSupportsCancellation = true;
        // RUN BACKGROUNDWORKER
        execBackground.RunWorkerAsync();
    }

    private void execBackground_DoWork(object sender, DoWorkEventArgs e)
    {
        // CREATE EXECUTOR INSTANCE
        Executor myExecutor = new Executor(arg1, arg2);
        myExecutor.RunWhileRemainMachines();
    }

    private void execBackground_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("RunWorkerCompleted execBackground");
    }
}

Но что происходит, так это то, что RunProcessingJob вызывается, когда я закрываю только окно (что нормально, потому что я запускаю его после ShowDialog). Я пытался вызвать его из общедоступной функции ExecutorWindow (), но тогда все наоборот: окно открывается только после завершения RunProcessingJob.

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

Должен ли я выполнять свое задание на обработку в BackgroundWorker, вызываемом из общедоступного ExecutorWindow ()?

Эта работа по обработке уже интенсивно использует BackgroundWorkers, и я не уверен, что это элегантный способ ..

РЕДАКТИРОВАТЬ: я обновил свой код на основе ваших комментариев (работает непосредственно в моем окне без создания другого потока. Плюс я запускаю свое задание на обработку из окна Конструктора, но теперь в отдельном потоке, чтобы предотвратить возникшие у меня проблемы с блокировкой) .

Ответы [ 3 ]

1 голос
/ 25 апреля 2011

Это полностью зависит от того, что делает Executor.RunProcessingJob; на вопрос нельзя ответить, не посмотрев на этот код.

Однако, почему вы создаете ExecutorWindow в другом потоке? Если вы хотите, чтобы он оставался чувствительным к пользовательскому вводу, у вас нет другого выбора, кроме как выполнить обработку в еще одном потоке (вы упомянули BackgroundWorker, так что это, вероятно, уже происходит). Но если вы это сделаете, вам не нужно создавать ExecutorWindow в своем собственном потоке.

0 голосов
/ 25 апреля 2011

Я думаю, вы должны начать обработку потока в вашем классе ExecutorWindow. Подцепите его к какому-нибудь событию, например, Load. Также я не думаю, что вам нужна отдельная тема для создания и отображения вашего ExecutorWindow. (Если вам не нужен модальный диалог, просто вызовите Show () вместо ShowDialog ())

0 голосов
/ 25 апреля 2011

Переопределить ExecutorWindow метод OnInitialize

protected override void OnInitialized(EventArgs e)
    {
        base.OnInitialized(e);
        RunExecutor();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...