C # / Связь между асинхронной сетью и графическим интерфейсом - PullRequest
1 голос
/ 12 июня 2011

Я делаю асинхронную сеть в C # .NET с классами TcpClient и TcpListener. Я использую WinForms для GUI.

Всякий раз, когда я получаю данные с удаленного компьютера, операция выполняется в другом основном потоке.

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

// this method is called whenever data is received
// it's async so it runs on a different thread
private void OnRead(IAsyncResult result)
{
    // update the GUI here, which runs on the main thread
    // (a direct modification of the GUI would throw a cross-thread GUI exception)
}

Как мне этого добиться?

Ответы [ 3 ]

3 голосов
/ 12 июня 2011

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

Пример:

public static void PerformInvoke(Control ctrl, Action action)
{
    if (ctrl.InvokeRequired)
        ctrl.Invoke(action);
    else
        action();
}

Использование:

PerformInvoke(textBox1, () => { textBox1.Text = "test"; });
2 голосов
/ 12 июня 2011

в GUI написать функцию, как это:

 public void f() {

        MethodInvoker method = () => {
            // body your function
        };

        if ( InvokeRequired ) {
            Invoke( method );  // or BeginInvoke(method) if you want to do this asynchrous
        } else {
            method();
        }
    }

, если вы в другом потоке вызываете эту функцию, она будет вызываться в потоке GUI

0 голосов
/ 12 июня 2011

Я добавил метод расширения в код, предложенный Алексом.Становится еще лучше!

// Extension method
public static class GuiHelpers
{
    public static void PerformInvoke(this Control control, Action action)
    {
        if (control.InvokeRequired)
            control.Invoke(action);
        else
            action();
    }
}


// Example of usage
private void EnableControls()
{
    panelMain.PerformInvoke(delegate { panelMain.Enabled = true; });
    linkRegister.PerformInvoke(delegate { linkRegister.Visible = true; });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...