Gui没有正确更新(来自异步)

时间:2012-05-05 03:47:59

标签: c# user-interface asynchronous delegates

我有一个问题一直让我疯狂。我有一个非常简单的异步TCP客户端/服务器,我已经创建了。当我收到TCP消息时,我想将它添加到文本框(基本上是一个简单的聊天程序)。我意识到异步方法是在后台线程上运行的,所以我使用InvokeRequired来确保GUI由正确的线程更新(参见下面的代码)。

接收消息并将其添加到文本框中。奇怪的是,每当收到新消息时,文本框都会添加新消息,但会删除其他所有消息。这仅适用于异步调用(其他调用不会删除文本框)。这有什么理由吗?

由于

private void UpdateText(string message)
{
    if (this.InvokeRequired)
    {
        UpdateDelegate update = new UpdateDelegate(UpdateText);
        this.Invoke(update, new object[] { message });
    }
    else
    {
        textHistory.Text = message + System.Environment.NewLine + textHistory.Text;
        textHistory.Refresh();
    }
}

放置Write语句以确保GUI线程正确访问文本框。

1 个答案:

答案 0 :(得分:0)

private void UpdateText(string message)
{
    if (this.InvokeRequired)
    {
        UpdateDelegate update = new UpdateDelegate(UpdateText);
        this.Invoke(update, new object[] { message });
    }
    else
    {
        var V = message + System.Environment.NewLine + textHistory.Text;
        textHistory.Text = V;
        textHistory.Refresh();
    }
}