как обрабатывать событие, которое запущено в потоках - PullRequest
0 голосов
/ 10 января 2012

Я задаю похожий вопрос здесь Я использую этот образец для реализации namedpipes в win-форме, но теперь мне нужно запустить это в консольном приложении, чтобы возникла проблема в событиях дескриптора,в исходном коде некоторые события объявлены и запущены в некоторых потоках следующим образом:

public class PipeServer {

  public delegate void MessageReceivedHandler(byte[] message)

  public event MessageReceivedHandler MessageReceived;


  void ListenForClients() {

    //Some code

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

  }

  void Read(object clientObj) {

    //Some Code

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

  }

}

Так что в форме win мы используем это так:

public partial class Form1 : Form {

private PipeServer pipeServer = new PipeServer();

public Form1(){

pipeServer.MessageReceived += pipeServer_MessageReceived;

}

void pipeServer_MessageReceived(byte[] message) {

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

public void Do_pipeServer_MessageReceived(byte[] message ) {

//Do Job

}

Поэтому, когда я использую консольное приложение, я могуне используете Invoke, кто-нибудь знает, какова реализация этого в консольных приложениях?

Ответы [ 3 ]

2 голосов
/ 10 января 2012

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

Подробнее об этом здесь: http://www.codeproject.com/KB/threads/SynchronizationContext.aspx

0 голосов
/ 10 января 2012

Наконец, я обнаружил, что для каждого события, которое сработало в PipeServer class, я удаляю это событие и заменяю его обработчиком (onevent), поэтому приведенный выше пример будет выглядеть следующим образом:

public class PipeServer {


void ListenForClients() {

//Some code

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

}

void Read(object clientObj) {

//Some Code

MessageReceived(ms.ToArray());

 }


void MessageReceived(byte[] message){

  //Do Job

}


}

И добавилконструктор для PipeServer class для необходимой реализации, в конце просто объявите экземпляр PipeServer.Этот подход, возможно, не является стандартной реализацией, но сработал для меня.

0 голосов
/ 10 января 2012

Invoke используется в Windows Forms для выполнения в потоке графического интерфейса. Но поскольку консольное приложение не имеет графического интерфейса, Invoke не предоставляется. Действительно ли имеет значение, какой поток выполняет обработчик события?

...