2016-03-04 108 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

簡短的回答,你不能eas ily做那個。如果您使用的是WPF,則需要在UI線程上運行該任務,因此也是調度程序。關於程序結構的一些細節將會很有用,對於你想要做什麼的更詳細的解釋也是有用的。 – Alex

+0

您一定希望在UI線程上發生UI更新,並且您不希望庫知道您的UI線程。你可以做的是找到一個優雅的方式來彌合他們。什麼讓你擔心你現在這樣做? –

+0

@Ycoub Massad對我來說似乎很麻煩,要求用戶放入使用Dispatcher的開銷。 –

回答

2

使用上述漢斯帕桑特的評論,我只是修改我的代碼如下:

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); 
     } 
    }