繁体   English   中英

从异步方法更新 UI

[英]Update UI from an Async method

我有这个从异步方法调用的方法

private void SocketConnected(Object sender, EventArgs e) {
    //Some code


    connectedLabel.Content = "Connected";
}

connectedLabel.Content = "Connected"; 引发错误。 我怎样才能从这个方法更新这个? 我已经看到一些帖子说使用 Invoke,但是,这给了我一个错误,即标签没有 Invoke 方法。

编辑:

通过查看评论中提到的 Dispatcher,我得到了这个可行的方法。

    private string message;
    public void UpdateConnected()
    {
        connectedLabel.Content = message;
    }

    private void SocketConnected(Object sender, EventArgs e) {
        //Some stuff

        message = "Connected";
        this.Dispatcher.BeginInvoke(new Action(this.UpdateConnected), DispatcherPriority.Background);
    }

这是 Dispatcher 的正确用法吗?

您可以创建扩展方法并使用 async/await

await socket.ConnectTaskAsync(host,port);
connectedLabel.Content = "Connected";

public static class SocketExtensions
{
    public static Task ConnectTaskAsync(this Socket socket, string host, int port)
    {
        return Task.Factory.FromAsync(
                         socket.BeginConnect(host, port, null, null),
                         socket.EndConnect);
    }
}

关于您的编辑,除非您需要异步方法在更新标签之前继续执行它剩下的工作,否则您可以只使用Dispatcher.Invoke而不是Dispatcher.BeginInvoke

如果您对差异感兴趣: Dispatcher Invoke(...) 与 BeginInvoke(...) 混淆

为什么不只是……?

// WPF
Dispatcher.BeginInvoke(new Action(() => label.Content = "my label"));

或者

// WinForms
BeginInvoke(new Action(() => label.Text = "my label"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM