Avalonia 支持标准 .NET 网络编程,需解耦网络逻辑与 UI 线程:TCP 用 TcpClient.ConnectAsync/ReadAsync/WriteAsync 并封装为服务类;UDP 用 UdpClient.SendAsync/ReceiveAsync 配合独立任务;所有 UI 更新必须通过 Dispatcher.UIThread.InvokeAsync。

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记录日志,View 绑定显示;添加项时仍需确保在 UI 线程调用Add() - 避免在后台任务中直接引用控件实例(如
myTextBox),保持关注点分离
推荐结构:分层 + 可取消 + 异常防护
实际项目中建议按以下方式组织,提升健壮性和可维护性:
- 通信类实现
IDisposable,用CancellationTokenSource支持主动断开 - 收发逻辑包裹
try/catch,捕获SocketException、ObjectDisposedException等常见异常 - 使用
WeakEventManager或手动解注册事件,防止内存泄漏(尤其长生命周期 ViewModel 监听短生命周期网络对象) - 调试阶段开启
UdpClient.EnableBroadcast = true或设置TcpClient.NoDelay = true观察行为










