[英]Avoid requiring Dispatcher.BeginInvoke
我正在寫一個庫來控制TCP上的應用程序。 連接是異步處理的,因此我向通信類添加了一個事件,以指示已接收到消息。
public event EventHandler<MessageRecievedEventArgs> MessageRecieved;
但是,當我引發事件時,主類中的事件處理程序將在TCP線程而非主線程上執行事件處理程序。
如何避免要求用戶通過調用來更新GUI?
private void MessageRecieved(object sender, MessageRecievedEventArgs e)
{
Dispatcher.BeginInvoke((Action)(()=> { textBox1.Text = e.Message; }));
}
使用上面的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);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.