Проблема с синтаксисом делегата в C # - PullRequest
6 голосов
/ 25 мая 2009

Я создал Testbox, чтобы узнать что-то о многопоточности в приложениях Windows Form. Silverlight и Java предоставляют Dispatcher, который действительно помогает при обновлении Элементы графического интерфейса.

Примеры кода: Делегат класса объявления

public delegate void d_SingleString(string newText);

Создать тему

        _thread_active = true;
        Thread myThread = new Thread(delegate() { BackGroundThread(); });
        myThread.Start();

Функция резьбы

    private void BackGroundThread()
    {
        while (_thread_active)
        {
            MyCounter++;
            UpdateTestBox(MyCounter.ToString());
            Thread.Sleep(1000);
        }
    }

Делегирование обновлений TextBox

    public void UpdateTestBox(string newText)
    {
        if (InvokeRequired)
        {
            BeginInvoke(new d_SingleString(UpdateTestBox), new object[] { newText });
            return;
        }
        tb_output.Text = newText;
    }

Есть ли способ объявить объявление Delate IN методом BeginInvoke?!

что-то вроде

BeginInvoke(*DELEGATE DECLARATION HERE*, new object[] { newText });

Большое спасибо, Rayt

Ответы [ 2 ]

9 голосов
/ 25 мая 2009

Во многих подобных случаях простейший подход - использовать «захваченную переменную» для передачи состояния между потоками; это означает, что вы можете сохранять логику локализованной:

public void UpdateTestBox(string newText)
{
    BeginInvoke((MethodInvoker) delegate {
        tb_output.Text = newText;
    });        
}

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

4 голосов
/ 25 мая 2009

Для таких простых делегатов вы можете использовать делегат Action<T> ( ссылка на msdn ) из фреймворка.

public void UpdateTestBox(string newText)
{
    if (InvokeRequired)
    {
        BeginInvoke(new Action<string>(UpdateTestBox), new object[] { newText });
        return;
    }
    tb_output.Text = newText;
}

Таким образом, вам не нужно вести собственные декларации делегатов.

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