Avalonia 本身不提供网络通信的专用控件或封装,但它是基于 .NET 的跨平台 UI 框架,完全支持使用标准 .NET 的
System.Net.Sockets(如
TcpClient、
UdpClient、
Socket类)进行 TCP/UDP 编程。关键在于:把网络逻辑和 UI 线程解耦,避免阻塞界面。
用 TcpClient 实现简单 TCP 客户端
适合点对点连接、可靠传输场景(如与设备、服务端通信)。注意不能在 UI 线程中直接调用
Connect或
Read这类同步阻塞方法。 用
await client.ConnectAsync(ip, port)替代
Connect()读写推荐用
NetworkStream配合
ReadAsync/
WriteAsync把通信逻辑封装在独立类中(比如
TcpService),通过事件或
IAsyncRelayCommand触发 更新 UI 时用
Application.Current.Dispatcher.UIThread.InvokeAsync(() => { /* 更新控件 */ })
用 UdpClient 实现无连接 UDP 收发
适合广播、低延迟、容忍丢包的场景(如局域网设备发现、实时状态上报)。
UdpClient默认是同步 API,但可配合
Task.Run或
ReceiveAsync(.NET 6+)避免卡主线程 发送用
await client.SendAsync(data, data.Length, endPoint)接收建议用循环 +
await client.ReceiveAsync(),并在单独任务中运行(不要用
BeginReceive等过时模式) 注意:UDP 不保证送达,需自行处理超时、重传或应用层确认
在 Avalonia 中安全更新界面
所有网络回调(包括
async void方法、Timer 回调、事件处理器)默认不在 UI 线程执行,直接访问
TextBox.Text会抛异常。 统一用
Dispatcher.UIThread.InvokeAsync包裹 UI 操作 若使用 MVVM,推荐在 ViewModel 中暴露
ObservableCollection<string></string>记录日志,View 绑定显示;添加项时仍需确保在 UI 线程调用
Add()避免在后台任务中直接引用控件实例(如
myTextBox),保持关注点分离
推荐结构:分层 + 可取消 + 异常防护
实际项目中建议按以下方式组织,提升健壮性和可维护性:
通信类实现IDisposable,用
CancellationTokenSource支持主动断开 收发逻辑包裹
try/catch,捕获
SocketException、
ObjectDisposedException等常见异常 使用
WeakEventManager或手动解注册事件,防止内存泄漏(尤其长生命周期 ViewModel 监听短生命周期网络对象) 调试阶段开启
UdpClient.EnableBroadcast = true或设置
TcpClient.NoDelay = true观察行为
