Какая сборка C # содержит Invoke? - PullRequest
5 голосов
/ 24 июня 2010

Альтернативный вопрос: почему VS10 так сильно хочет пожаловаться на Invoke?

В моем продолжающемся стремлении заставить мое приложение работать стать лучшим в мире программистом C #, я решил, что потоки - это Good Thing ™.

В MSDN есть полезная статья о поточно-ориентированных вызовах элементов управления , но он (и, похоже, каждая другая статья по этому вопросу) косвенно ссылается на метод Invoke. Иногда даже BeginInvoke, который я прочитал, предпочтительнее .

Все это было бы замечательно, если бы я мог заставить визуальную студию распознавать Invoke. MSDN говорит, что содержится в сборке System.Windows.Forms , но я уже «использую» это. Конечно, я также пытался использовать System.Threading, но безрезультатно.

Какие обручи мне нужно перепрыгнуть, чтобы заставить работать?

Ответы [ 6 ]

4 голосов
/ 24 июня 2010

Invoke находится в пределах контроля. То есть Control.Invoke();

Нет способа напрямую вызвать Invoke, так как в System.Windows.Forms такого метода нет. Метод Invoke является управляющим элементом.

Вот пример , который я сделал ранее:

public delegate void AddListViewItemCallBack(ListView control, ListViewItem item);
public static void AddListViewItem(ListView control, ListViewItem item)
{
    if (control.InvokeRequired)
    {
        AddListViewItemCallBack d = new AddListViewItemCallBack(AddListViewItem);
        control.Invoke(d, new object[] { control, item });
    }
    else
    {
        control.Items.Add(item);
    }
}
2 голосов
/ 24 июня 2010

winform Invoke - это метод экземпляра Control - вам просто нужен экземпляр элемента управления (который во многих случаях может быть this).Например:

txtBox.Invoke(...);

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

2 голосов
/ 24 июня 2010

Вам необходимо вызвать Invoke для экземпляра того, что содержит его - если вы используете Windows Forms, это будет элемент управления:

control.Invoke(someDelegate);

или длякод в форме, вы можете использовать неявную ссылку this:

Invoke(someDelegate);

Вам не нужно проходить какие-либо конкретные обручи.Если Visual Studio жалуется, укажите ошибку компилятора и код, на который она жалуется.Здесь нет ничего особенного в Invoke.

1 голос
/ 24 июня 2010

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

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

В любом случае, недостаточно использовать using System.Windows.Forms, вы должны добавить его к ссылкам.Щелкните правой кнопкой мыши на References в проводнике проекта, затем Добавьте ссылки и выберите System.Windows.Forms

0 голосов
/ 24 июня 2010

Вы, вероятно, пытаетесь вызвать Invoke из класса (т.е. не из Form или Control).Переместите свой код из класса в форму или элемент управления, и вы увидите, что Invoke компилируется и работает правильно (строго говоря, ваш код должен ссылаться на this.Invoke, что делает источник метода понятным, но Invoke также будет работать, так как предполагает this).

0 голосов
/ 24 июня 2010

Invoke - это метод для объектов, который обычно находится в элементах управления в библиотеке форм и некоторых асинхронных классах. Конечно, вам нужны определенные объекты, чтобы иметь возможность вызывать Invoke для , который control / class.

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