Почему InvokeRequired = False через Delegate.BeginInvoke? - PullRequest
0 голосов
/ 02 сентября 2010

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

Моя проблема в том, что мой ярлык никогда не устанавливается, а this.BeginInvoke() никогда не выполняется, я думаю, это связано с тем, что InvokeRequired = False.

    private delegate void BackgroundOperationDelegate(ViewMode mode);
    private BackgroundOperationDelegate backgroundOperationDelegate;

    private void FormControlPanel_Load(object sender, EventArgs e)
    {
        Init();
    }

    private void Init() {
        this.backgroundOperationDelegate = this.InitUIState;
        this.backgroundOperationDelegate.BeginInvoke(mode, null, null);
    }

    private void InitUIState(ViewMode mode)
    {
        // .. other business logic only here relevant
        // to the worker process ..
        this.BeginInvoke((MethodInvoker)delegate
        {
            this.labelProgramStatus.Text = CONSOLE_IDLE_STATUS;
        });
    }

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

Спасибо, ребята.

Изображения, подтверждающие две различные темы:
http://imgur.com/mq12Wl&X5R7G
http://imgur.com/mq12W&X5R7Gl

Дополнительный вопрос: Является ли этот способ создания тем предпочтительным? Я просто всегда находил это таким простым и легким. Возможно, я должен использовать thread.Start(), и я буду избегать этих проблем?

Ответы [ 3 ]

2 голосов
/ 02 сентября 2010

Ваш второй BeginInvoke вызовет исключение.

Попробуйте

private void InitUIState(ViewMode mode)
{
    if (this.InvokeRequired)
    {
        this.BeginInvoke((MethodInvoker)delegate
        {
            InitUIState(mode);
        });
    }
    else
    {
        this.labelProgramStatus.Text = CONSOLE_IDLE_STATUS;
    }
}
0 голосов
/ 02 сентября 2010

Вы смешиваете BeginInvoke для Form и Delegate, поскольку оба они имеют одинаковое имя метода.

Метод Form, BeginInvoke вызывает метод, который запрашивается в том же потоке пользовательского интерфейса, но на более поздней стадии, послеобработка собственных ожидающих операций пользовательского интерфейса.По этой причине InvokeRequired всегда будет ложным в методе BeginInvoke формы.

Метод делегата, BeginInvoke вызывает метод в новом потоке асинхронно в пуле потоков.И InvokeRequired в делегате BeginInvoke всегда будет истинным.

0 голосов
/ 02 сентября 2010

Invoke и BeginInvoke для делегатов не совпадают с ISynchronizeInvoke.

Также вам необходимо позвонить EndInvoke при работе с делегатом.

...