2016-03-04 4 views
1

Я пишу библиотеку для управления приложением через TCP. Соединения обрабатываются асинхронно, поэтому я добавил событие в класс связи, чтобы указать, что сообщение получено.Избегайте использования Dispatcher.BeginInvoke

public event EventHandler<MessageRecievedEventArgs> MessageRecieved; 

Но когда я поднимаю событие обработчик события в главном классе выполняет обработчик события на TCP поток не основной нити.

Как избежать необходимости обновления пользователем GUI путем вызова?

private void MessageRecieved(object sender, MessageRecievedEventArgs e) 
    { 
     Dispatcher.BeginInvoke((Action)(()=> { textBox1.Text = e.Message; })); 
    } 
+0

Короткий ответ, вы не можете ily делаю это. Если вы используете WPF, вам нужно запустить задачу в потоке пользовательского интерфейса, следовательно, диспетчер. Некоторые детали относительно структуры вашей программы были бы полезны, как и более подробное объяснение того, что вы пытаетесь сделать. – Alex

+0

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

+0

@Ycoub Massad Мне кажется, что мне неловко требовать, чтобы пользователь вносил накладные расходы с помощью Диспетчера. –

ответ

2

Используя комментарий Hans Passant в выше, я просто изменил мой код следующим образом:

private SynchronizationContext MainUIThread; //as a class field 

В конструкторе:

public MyClass() 
{ 
     MainUIThread = SynchronizationContext.Current; 
} 

Модификация структуры события:

public event EventHandler<MessageRecievedEventArgs> MessageRecieved; 

    protected virtual void OnMessageReceived(object sender, MessageRecievedEventArgs args) 
    { 
     var handle = MessageRecieved; 

     if (handle == null) 
      return; 

     if(MainUIThread != null) 
     { 
      MainUIThread.Post(d => handle(sender, args), this); 
     } 
     else 
     { 
      handle(sender, args); 
     } 
    } 
Смежные вопросы