Как вызвать некоторый метод внутри ни одного класса управления - PullRequest
0 голосов
/ 09 января 2012

Я использую некоторые делегаты и события для реализации NamedPipes, например:

public delegate void MessageReceivedHandler(byte[] message, Client client);

public event MessageReceivedHandler MessageReceived;

void ListenForClients() {

//Do some

Thread readThread = new Thread(Read) { IsBackground = true };

}

void Read(object clientObj) {

//Do Some

if(MessageReceived != null)
MessageReceived(ms.ToArray(),client);

}

Когда я использую это событие в классе формы (унаследованном от объекта Control), реализация:

public partial class Form1 : Form {

public Form1(){
    pipeServer.MessageReceived += pipeServer_MessageReceived;
}

  void pipeServer_MessageReceived(byte[] message, PipeServer.Client client) {

      Invoke(new PipeServer.MessageReceivedHandler(Do_pipeServer_MessageReceived),
                    new object[] { message, client });
  }

  public void Do_pipeServer_MessageReceived(byte[] message, PipeServer.Client client) {
  // Do Some
  }
}

Но когда я хочу использовать это в некоторых других классах, которые не унаследованы от управляющего объекта, я не могу Invoke никакие методы, а также не могу заменить реализацию целевого метода Do_pipeServer_MessageReceived в методе Invoker pipeServer_MessageReceived, который вызывает исключениетак что вы предлагаете?

1 Ответ

3 голосов
/ 09 января 2012

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

Если вы не трогаете графический интерфейс в этом обратном вызове, не беспокойтесь о вызовах.

Если вы делаете прикосновения к графическому интерфейсу, то по определению у вас должна быть ссылка на какой-то элемент управления, который вы обновляете.Позвоните Invoke на этот контроль.Это действительно не имеет значения, на каком контроле вы вызываете Invoke;они все будут делать то же самое.

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