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