跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C Sharp 异步网络编程
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= C#异步网络编程 = 异步网络编程是现代C#应用程序开发中的核心概念,它允许程序在执行网络操作时保持响应性,避免阻塞主线程。本章将详细介绍C#中异步网络编程的原理、实现方式及最佳实践。 == 概述 == '''异步网络编程'''是指程序在等待网络I/O操作(如HTTP请求、TCP连接等)完成时,不阻塞调用线程,而是通过回调、任务或异步/等待模式继续执行其他工作。C#通过'''Task-based Asynchronous Pattern (TAP)'''提供了一套简洁的异步编程模型。 主要优势: * 提高应用程序响应能力 * 更高效的线程资源利用 * 简化复杂的并发操作 == 核心概念 == === 同步 vs 异步 === {| class="wikitable" |- ! 同步网络编程 !! 异步网络编程 |- | 阻塞调用线程直到操作完成 || 立即返回控制权,操作完成后通知 |- | 简单但效率低 || 复杂但高效 |- | 可能导致UI冻结 || 保持UI响应 |} === async/await 关键字 === C# 5.0引入的关键字组合: * <code>async</code>:标记方法为异步 * <code>await</code>:暂停方法执行直到异步操作完成 == 实现方式 == === 使用HttpClient进行异步HTTP请求 === <syntaxhighlight lang="csharp"> using System; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { using HttpClient client = new HttpClient(); try { // 异步GET请求 string response = await client.GetStringAsync("https://api.example.com/data"); Console.WriteLine($"响应内容: {response.Substring(0, 50)}..."); } catch (HttpRequestException e) { Console.WriteLine($"请求失败: {e.Message}"); } } } </syntaxhighlight> '''输出示例'''(假设API返回JSON): <pre> 响应内容: {"status":"success","data":[{"id":1,"value":"exa... </pre> === TCP异步通信 === <syntaxhighlight lang="csharp"> using System; using System.Net; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; class TcpAsyncExample { public static async Task StartServer() { TcpListener listener = new TcpListener(IPAddress.Any, 8080); listener.Start(); Console.WriteLine("服务器已启动..."); TcpClient client = await listener.AcceptTcpClientAsync(); using NetworkStream stream = client.GetStream(); byte[] buffer = new byte[1024]; int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); string message = Encoding.UTF8.GetString(buffer, 0, bytesRead); Console.WriteLine($"收到消息: {message}"); byte[] response = Encoding.UTF8.GetBytes("消息已接收"); await stream.WriteAsync(response, 0, response.Length); } public static async Task StartClient() { using TcpClient client = new TcpClient(); await client.ConnectAsync("localhost", 8080); using NetworkStream stream = client.GetStream(); byte[] message = Encoding.UTF8.GetBytes("Hello Server!"); await stream.WriteAsync(message, 0, message.Length); byte[] buffer = new byte[1024]; int bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length); Console.WriteLine($"服务器响应: {Encoding.UTF8.GetString(buffer, 0, bytesRead)}"); } } </syntaxhighlight> '''执行流程''': <mermaid> sequenceDiagram participant Client participant Server Client->>Server: ConnectAsync() Server->>Client: 接受连接 Client->>Server: WriteAsync("Hello Server!") Server->>Client: ReadAsync() Server->>Client: WriteAsync("消息已接收") Client->>Server: ReadAsync() </mermaid> == 高级主题 == === 取消异步操作 === 使用<code>CancellationToken</code>实现操作取消: <syntaxhighlight lang="csharp"> var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); // 10秒超时 try { var response = await httpClient.GetAsync(url, cts.Token); // 处理响应 } catch (TaskCanceledException) { Console.WriteLine("请求超时被取消"); } </syntaxhighlight> === 并行异步请求 === 使用<code>Task.WhenAll</code>并行执行多个异步操作: <syntaxhighlight lang="csharp"> var task1 = httpClient.GetStringAsync(url1); var task2 = httpClient.GetStringAsync(url2); string[] results = await Task.WhenAll(task1, task2); </syntaxhighlight> == 性能考量 == 异步网络编程的性能可以用以下公式表示: <math> T_{async} = T_{setup} + \frac{T_{io}}{n} </math> 其中: * <math>T_{async}</math>是异步操作总时间 * <math>T_{setup}</math>是初始设置时间 * <math>T_{io}</math>是I/O操作时间 * <math>n</math>是并行操作数 == 实际应用案例 == '''实时股票行情系统''': 1. 异步连接多个交易所API 2. 并行处理价格更新 3. 使用WebSocket实现实时推送 4. 优雅处理网络中断和重连 == 最佳实践 == * 始终使用<code>await</code>而非<code>.Result</code>或<code>.Wait()</code> * 为长时间运行的操作实现取消机制 * 合理配置连接池大小 * 使用<code>ConfigureAwait(false)</code>避免不必要的上下文切换 * 正确处理异常和资源释放 == 常见错误 == {| class="wikitable" |- ! 错误 !! 解决方案 |- | 忽略异步异常 || 使用try-catch包裹await调用 |- | 异步void方法 || 尽量使用async Task而非async void |- | 死锁(.Result调用) || 始终使用await |- | 资源泄漏 || 对IDisposable对象使用using语句 |} == 总结 == C#异步网络编程通过async/await模式提供了强大的工具来处理网络I/O操作,同时保持代码的可读性和可维护性。理解这些概念对于构建高性能、响应迅速的现代应用程序至关重要。 [[Category:编程语言]] [[Category:C Sharp]] [[Category:C Sharp 网络编程]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)