C # темы и это. Invalidate () - PullRequest
2 голосов
/ 03 марта 2009

Я занимаюсь разработкой приложения для Windows Mobile ( Compact Framework 2.0 SP1 ), и этот код вызывает ошибку:



        public Image Imagen
        {
            get
            {
                return imagen;
            }
            set
            {
                imagen = value;
                this.Invalidate();
            }
        }

Код вызывается из нового потока. Я пытался решить с помощью ** InvokeRequired:


        public Image Imagen
        {
            get
            {
                return imagen;
            }
            set
            {
                imagen = value;
                if (this.InvokeRequired)
                    this.Invoke(this.Invalidate);
                else
                    this.Invalidate();
            }
        }

Но строка this.Invoke (this.Invalidate); не компилируется. Как я могу решить проблему? Первая ошибка заключается в том, что вы можете взаимодействовать с элементами управления, созданными в другом потоке.

Спасибо!

Ответы [ 4 ]

7 голосов
/ 18 января 2011

Invalidate не требует вызова.

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

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

3 голосов
/ 03 марта 2009

Попробуйте это.

Длинная версия того, почему это необходимо. Вместо того, чтобы принимать конкретный тип делегата в качестве параметра, метод Invoke принимает тип System.Delegate. Этот тип не обеспечивает типизации для строго типизированной подписи. Это базовый класс делегатов, и вместо этого он предоставляет общий механизм для вызова всех делегатов.

К сожалению, при передаче имени метода в качестве источника делегата в C # оно должно быть передано конкретному типу делегата. В противном случае C # не знает, какой тип делегата создавать внутри и в отличие от VB, он не будет генерировать анонимные типы делегатов. Вот почему вам нужен определенный тип делегата, такой как MethodInvoker, для вызова функции.

РЕДАКТИРОВАТЬ MethodInvoker, определенный вручную, поскольку он не существует в Compact Framework

public delegate void MethodInvoker();

public Image Imagen
{
    get { get return imagen; }
    set {
        imagen = value;
        if (this.InvokeRequired)
            this.Invoke(new MethodInvoker(this.Invalidate));
        else
            this.Invalidate();
    }
}
0 голосов
/ 03 марта 2009

Мое решение для Compact Framework 2.0 SP1 таково:

...

delegate void InvocadorMetodos();

...

        public Image Imagen
        {
            get
            {
                return imagen;
            }
            set
            {
                imagen = value;
                if (this.InvokeRequired)
                {
                    InvocadorMetodos invalida = Invalidar;
                    this.Invoke(invalida);
                }
                else
                    this.Invalidar();

            }
        }


Спасибо!

0 голосов
/ 03 марта 2009

Функция Invoke ожидает делегата, поэтому вы можете использовать встроенный делегат Action:

public Image Imagen
{
    get
    {
        return imagen;
    }
    set
    {
        imagen = value;
        if (this.InvokeRequired)
            this.Invoke(new Action(this.Invalidate));
        else
            this.Invalidate();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...