C#异步编程研究学习(一)

可以使用Func<T>或者Action<T>简单实现如:

 Func<string, string,string,string, int> func = new Func<string, string, string,string,int>(OrderManager.CallWebService);
 func.BeginInvoke(orderCode, "0",userLoginName,ipAddress, null,resultCode);

这样直接就将方法改为异步的了。

Func<T>和Action<T>是.netFramework提供的委托,有很多重载。

区别是Func<T>有返回参数,Action<T>没有返回参数。

上面的例子:null是回调函数,可以定义一个回调函数,让方法执行完毕后在回调函数中做一些通知或者其他事情。

当Func<T>和Action<T>和不满足要求时,可以自定义委托,然后现实异步。

 

第二种使用:.Net Framework 4.0新增的System.Threading.Tasks命名空间下的Task类。

new一个Task类的对象,可以开启一个任务:

Task task = new Task(TaskMethod);
task.Start();

 

Task类有个静态属性Factory,这个属性返回一个TaskFactory对象。将方法传递给StartNew方法,任务会立即启动。

System.Threading.Tasks.Task.Factory.StartNew(() => OrderManager.CallWebService(orderCode, "0"));

第二种方法摘抄自:C#异步编程的实现方式(4)——Task任务

您可以到这篇文章阅读,更简单明了的说明。

 

第三种:ThreadPool

利用ThreadPool也可以实现异步操作。

static void Main(string[] args)
 {
     for (int i = 1; i <= 3; i++)
      {
         ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i);
      }
      Console.Read();
  }

该文照抄自:C#异步编程的实现方式(3)——ThreadPool线程池

第四种:使用Thread

Thread thread3 = new Thread(ThreadMethod3);
 thread3.Start(new ThreadData() { Message = "Hello world!" });

Thread可以传递一个Object参数,可以在object中封装你需要的任何参数。

第五种方法:C#异步编程的实现方式(1)——异步委托

感觉这种方法很强大,只是还没用过。

1)通过IsCompleted属性来判断该委托是否执行完成。

复制代码
   1: static void Imp1()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
   5:     IAsyncResult ar = dl.BeginInvoke(5000, null, null);
   6:  
   7:     while (!ar.IsCompleted)
   8:     {
   9:         Console.Write(".");
  10:         Thread.Sleep(50);
  11:     }
  12:     string result = dl.EndInvoke(ar);
  13:     Console.WriteLine("result: {0}", result);
  14: }
复制代码

2、等待句柄(AsyncWaitHandle属性)

使用IAsyncResult的AsyncWaitHandle属性可以访问等待句柄,这个属性返回一个WaitHandle对象,这个对象的WaitOne()方法可输入一个超时时间作为参数,设置等待的最长时间。如果超时,WaitOne()方法返回一个bool值,true为等待成功(即委托完成),异步调用的方法与上面一样,下面是主线程实现:

复制代码
   1: static void Imp2()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:  
   5:     IAsyncResult ar = dl.BeginInvoke(5000, null, null);
   6:     while (true)
   7:     {
   8:         Console.Write(".");
   9:         if (ar.AsyncWaitHandle.WaitOne(50))
  10:         {
  11:             Console.WriteLine("Can get the result now");
  12:             break;
  13:         }
  14:     }
  15:     string result = dl.EndInvoke(ar);
  16:     Console.WriteLine("result: {0}", result);
  17: }
复制代码
主线程每等待50秒做一次判断是否完成。
 
3、异步回调(AsyncCallBack委托)
BeginInvoke方法第二个参数可传入一个AsnycCallBack委托类型的方法,当异步调用完成时会执行这个方法。我们可以用Lambda表达式来实现:

 

复制代码
   1: static void Imp3()
   2: {
   3:     MyDelegate dl = DelegateMethod;
   4:     dl.BeginInvoke(5000, new AsyncCallback(ar =>
   5:     {
   6:         string result = dl.EndInvoke(ar);
   7:         Console.WriteLine("result: {0}", result);
   8:     }), null);
   9:     for (int i = 0; i < 100; i++)
  10:     {
  11:         Console.Write(".");
  12:         Thread.Sleep(50);
  13:     }
  14: }
复制代码

BeginInvoke方法的最后一个参数可以用IAsyncResult的AsyncState属性获取。

参考资料:《C#高级编程》

第六种:C#异步编程的实现方式(5)——连续任务

如需学习,请异步原作者博客查看。

 

posted on   荆棘人  阅读(187)  评论(0编辑  收藏  举报

编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示