Rao Tahir Ответов: 1

Вызов метода из делегата.


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

Что я уже пробовал:

public delegate void CallbackDelegate();

        static CallbackDelegate myDelegate;
        static int count = 0;
        static private void CallBack_DBEvent()
        {
            count++;
            Display();
            // getting error
            //An object reference is required for the non-static field, method, or property 'WindowsFormsApplication1.Form1.Display()'
        }

        public void Display()
        {
            textBox1.Text = count.ToString();
        }

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            myDelegate = new CallbackDelegate(CallBack_DBEvent);
            CallBack_DBEvent();
        }

Richard MacCutchan

И что же? Что происходит, когда вы это делаете?

Nathan Minier

Продолжайте вопрос Ричарда: это работает на другом потоке?

Rao Tahir

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

1 Ответов

Рейтинг:
8

OriginalGriff

Объявите свой делегат и некоторые "целевые" методы с соответствующими сигнатурами

delegate void myDelegate(string name);
static void myFunction1(string name)
    {
    Console.WriteLine("1: " + name);
    }
static void myFunction2(string name)
    {
    Console.WriteLine("2: " + name);
    }
Тогда позвони им:
myDelegate del = new myDelegate(myFunction1);
del("Joe Smith");
del = new myDelegate(myFunction2);
del("Mike Brown");
Вы также можете вызвать его с помощью анонимного метода:
del = delegate(string name) { Console.WriteLine("Anon: " + name); };
del("Jane Doe");
Или лямбда:
del = name => { Console.WriteLine("Lambda: " + name); };
del("Mary Jane");