c#异步

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication4
{
    class Program
      {
          static void Main(string[] args)
          {
             Console.WriteLine("同步调用开始=>");
             int a = SyncAdd(1, 2);
             Console.WriteLine("同步调用结束:" + a);
 
             Console.WriteLine("--------------------------");
 
             Console.WriteLine("异步调用开始=>");
             AyscAdd(3, 4, (result) =>
             {
                 Console.WriteLine("异步调用结果:" + result);
             });
             Console.WriteLine("异步调用结束");
 
             Console.ReadLine();
         }
 
         /// <summary>
         /// 异步调用
         /// </summary>
         /// <param name="a"></param>
         /// <param name="b"></param>
         /// <param name="callBackAction"></param>
         /// <returns></returns>
         static void AyscAdd(int a, int b, Action<int> callBackAction)
         {
             Func<int> func = () =>
             {
                 return new MyMath().Add(a, b);
             };
             func.BeginInvoke((ar) =>
             {
                 var result = func.EndInvoke(ar);
                 callBackAction.Invoke(result);
             },
             null);
 
         }
 
         /// <summary>
         /// 同步调用
         /// </summary>
         /// <param name="a"></param>
         /// <param name="b"></param>
         /// <returns></returns>
         static int SyncAdd(int a, int b)
         {
             return new MyMath().Add(a, b);
         }
     }
 
     public class MyMath
     {
 
         public int Add(int a, int b)
         {
             System.Threading.Thread.Sleep(5000);
             return a + b;
         }
 
     }
}

### C# 异步编程基础 C# 提供了一种简洁的方式来处理异步操作,主要通过 `async` 和 `await` 关键字实现。这种方法使得开发者能够轻松编写非阻塞代码,从而提高应用程序的响应性和性能。 #### 定义与作用 异步编程是一种允许程序执行其他任务而不等待长时间运行的操作完成的技术[^1]。在 C# 中,这种技术通常用于网络请求、文件 I/O 或数据库查询等场景下,以防止主线程被挂起。 #### 基本语法结构 当函数声明为 `async` 时,它可以在内部使用 `await` 来暂停其执行直到某个异步过程结束。下面是一个简单的例子展示如何定义并调用一个异步方法: ```csharp public async Task DoWorkAsync() { Console.WriteLine("Start work..."); await Task.Delay(2000); // Simulate an asynchronous operation that takes 2 seconds Console.WriteLine("End work after delay."); } ``` 在此示例中,`Task.Delay` 方法模拟了一个耗时的任务,在此期间不会阻止 UI 线程或其他重要进程继续工作。 #### 实际应用案例 考虑这样一个实际应用场景——从 Web API 获取数据并将结果显示给用户界面而无需冻结整个窗口体验: ```csharp private async void FetchDataButton_Click(object sender, EventArgs e) { string result = await DownloadStringAsync(new Uri("http://example.com")); DisplayResult(result); } private static async Task<string> DownloadStringAsync(Uri address) { using (HttpClient client = new HttpClient()) { return await client.GetStringAsync(address); } } ``` 这里展示了点击按钮事件触发下载字符串的过程,并且由于采用了异步模式,即使网络延迟也不会影响到 GUI 的流畅度。 #### 最佳实践建议 为了充分利用 C#异步功能,遵循一些推荐的最佳做法非常重要: - 避免在库代码中使用同步转异步的方法(如 `.Wait()` 或 `.Result`),这可能导致死锁情况发生。 - 总是以一致的方式命名您的异步方法;一般惯例是在常规名称后面加上 “Async”,比如上面提到的 `DownloadStringAsync` 函数名。 - 对异常情况进行妥善管理,因为它们可能发生在不同的线程上并且行为不同于标准同步错误捕捉机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值