Проблема: InvokeRequired всегда False при попытке показать форму в приложении c # windows - PullRequest
1 голос
/ 09 октября 2009

Я пытаюсь реализовать один экземпляр формы. Потому что мое приложение предназначено для скрытия и динамического отображения различных форм в соответствии с некоторыми значениями времени выполнения.


когда я хочу показать форму Trainee_Login из файла класса, я делаю это ...

Trainee_login ShowTraineelogin = Trainee.login.TraineeloginRef; ShowTraineelogin.ShowScreen (); * +1006 *


когда я хочу скрыть форму Trainee_Login из файла класса, я делаю это ...

Trainee_login HideTraineelogin = Trainee.login.TraineeloginRef; HideTraineelogin.HideScreen ();


Проблема в том, что InvokeRequired всегда ложно, а условие else выполняется. Я использую тот же шаблон и для других форм, где Invokerequired имеет значение true, и если выполняется условие showscreen (). Та же проблема и для Hidescreen ().

Я что-то упустил ??


Код в моей форме Trainee_login:

private static Trainee_Login Trainee_LoginInstance = null;

 public static Trainee_Login Trainee_LoginRef
    {
        get
        {
            if (Trainee_LoginInstance == null)
                Trainee_LoginInstance = new Trainee_Login();
            return Trainee_LoginInstance; 
        }
    }

    public void showScreen()
    {
        if (this.InvokeRequired == true)
        {
            this.Invoke(new MethodInvoker(this.showScreen));
        }
        else
        {
            this.Show();
        } 

    }
    public void hideScreen()
    {
        if (this.InvokeRequired == true)
        {
            this.Invoke(new MethodInvoker(this.hideScreen));
        }
        else
        {
            this.Hide();
        }
    }

Ответы [ 2 ]

4 голосов
/ 09 октября 2009

Возможно, дескриптор не создан, вы можете проверить это с помощью IsHandleCreated. См. этот вопрос , чтобы узнать о многочисленных проблемах использования IvokeReqired. Вы можете видеть, что мой собственный ответ был далеко не простым, чтобы реально заставить его работать надежно.

Я бы порекомендовал сначала не использовать пользовательский интерфейс Если вам необходимо использовать отражатель .Net, чтобы увидеть, что на самом деле делают эти вызовы API.

Обновление:

@ karthik, ваш образец недостаточно полон, чтобы я мог его исправить. Я не могу сказать, когда или в каком потоке форма могла быть создана. Я могу сказать вам, что, если вы просто позвоните по этому поводу из любой старой организации, это не сработает, для этого нужен насос сообщений. Есть три способа получить сообщение в потоке:

  1. Вызовите приложение. Выполните
  2. Форма вызова. ShowModalDialog
  3. Вызов приложения. События в цикле
2 голосов
/ 09 октября 2009

InvokeRequired необходим только при работе с несколькими потоками. Я не вижу в вашем коде, где вы будете использовать более одного потока. Открытие и закрытие форм происходит в основном потоке пользовательского интерфейса, поэтому в вашем сценарии это не нужно.

Добавлена ​​

На тот случай, если вам это нужно, введение в многопоточность можно найти здесь:

http://www.yoda.arachsys.com/csharp/threads/

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