beginInvoke, GUI и поток - PullRequest
       6

beginInvoke, GUI и поток

6 голосов
/ 07 июня 2011

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

Функция вызова T2, которая обновляет что-то в форме GUI.

  public void f() {
        // controler.doSomething();
  }


 public void FUNCTION() {

    MethodInvoker method = delegate {
            f();
    };

    if ( InvokeRequired ) {
        BeginInvoke( method );
    } else {
            f();
    }
 }

Но теперь я должен объявить две функции.Как это использовать только одну функцию?Или как это правильно.

Ответы [ 2 ]

16 голосов
/ 07 июня 2011

Вы можете сделать это одним методом, вызвав себя:

public void Function()
{
     if (this.InvokeRequired)
     {
         this.BeginInvoke(new Action(this.Function));
         return;
     }

     // controller.DoSomething();         
}

Редактировать в ответ на комментарии:

Если вам нужно передать дополнительные аргументы, вы можетесделать это с помощью лямбда-выражения следующим образом:

public void Function2(int someValue)
{
     if (this.InvokeRequired)
     {
         this.BeginInvoke(new Action(() => this.Function2(someValue)));
         return;
     }

     // controller.DoSomething(someValue);         
}
3 голосов
/ 07 июня 2011

выглядит хорошо для меня. Вы можете изменить анонимного делегата на лямбду, что немного чище. Чтобы избавиться от объявления метода f (), вы можете встроить его код в делегат, а затем либо вызвать делегат как MethodInvoker, либо просто вызвать его, как любой другой метод:

 public void FUNCTION() {

    MethodInvoker method = ()=> controller.doSomething();

    if ( InvokeRequired ) {
        BeginInvoke( method );
    } else {
            method();
    }
 }
...