簡體   English   中英

避免要求Dispatcher.BeginInvoke

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM