.NET异步委托

Posted stualan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了.NET异步委托相关的知识,希望对你有一定的参考价值。

可以使用异步方法来执行委托,beginInvoke,endInvoke
用异步自己开辟线程,可能会造成线程阻塞(出现了程序不运行状态,应该是线程阻塞)
OBJECT类型用于传递任何想要的数据类型,它可以通过IAsyncResult的AsyncState属性获得。

注意事项:

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Remoting.Messaging;
 5 using System.Text;
 6 using System.Threading;
 7 using System.Threading.Tasks;
 8 
 9 namespace ConsoleTest
10 {
11     class AsyncDelegate
12     {
13         public delegate int Adddelegate(int x, int y);
14         static void Main(string[] args)
15         {
16             TimeSpan ts1 = new TimeSpan(DateTime.Now.Ticks); //获取当前时间的刻度数  
17             System.Console.WriteLine("线程开始了begintime:{0}-------------------\\r\\n",System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss ffff"));
18             Thread.CurrentThread.Name = "Main Thread";
19             AsyncDelegate ad = new AsyncDelegate();
20             //int sd = ad.Add(4, 5);
21             Adddelegate adl = new Adddelegate(ad.Add);
22            // IAsyncResult asyncResult = adl.BeginInvoke(7, 8, null, null);
23             AsyncCallback asynccll = new AsyncCallback(ad.AsyncAdd);//AsyncCallback其实也是一种委托,接受的参数为签名(IAsyncCallback ar)
24             Object ob = (object)"我是传递的数据";
25             adl.BeginInvoke(4,6, asynccll,ob);
26 
27             for (int i = 0; i < 5; i++)
28             {
29                 Thread.Sleep(TimeSpan.FromSeconds(i));
30                 System.Console.WriteLine("线程名:{0},等待时间{1}", Thread.CurrentThread.Name, i);
31             }
32            // int sd = adl.EndInvoke(asyncResult);
33             System.Console.WriteLine("\\n想退出按任意键!!!");
34            // System.Console.WriteLine("返回值是{0}", sd);
35             TimeSpan ts2 = new TimeSpan(DateTime.Now.Ticks);
36             TimeSpan ts = ts2.Subtract(ts1).Duration(); //时间差的绝对值  
37   String spanTime = ts.Hours.ToString() + "小时" + ts.Minutes.ToString() + "" + ts.Seconds.ToString() + ""; //以X小时X分X秒的格式现实执行时间 
38             System.Console.WriteLine("线程开始了endtime:{0}-----\\r\\n{1}", System.DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss ffff"),spanTime);
39 
40         }
41         public int Add(int x, int y)
42         {
43             if (Thread.CurrentThread.IsThreadPoolThread)
44             {
45                 //给开辟的线程池中的子线程设置名称
46                 Thread.CurrentThread.Name = "HAHHA";
47             }
48             System.Console.WriteLine("方法开始了");
49             for (int i = 0; i <= 2; i++)
50             {
51                 Thread.Sleep(TimeSpan.FromSeconds(i));
52                 System.Console.WriteLine("线程名:{0},等待时间{1}", Thread.CurrentThread.Name, i);
53             }
54             System.Console.WriteLine("方法执行完毕");
55             return x + y;
56         }
57         public void AsyncAdd(IAsyncResult ar)
58         {
59             AsyncResult acresult = (AsyncResult)ar;
60             Adddelegate del = (Adddelegate)acresult.AsyncDelegate;
61             string data = acresult.AsyncState.ToString();
62             int stn = del.EndInvoke(acresult);
63             System.Console.WriteLine("线程名称:{0},返回值:{1},传递的数据{2}",Thread.CurrentThread.Name,stn,data);
64 
65         }
66     }
67 }

 

以上是关于.NET异步委托的主要内容,如果未能解决你的问题,请参考以下文章

C#委托异步调用

java 登录过程 - android片段,异步任务登录,Asp.net控制器,存储库

C# 1.0 特性之异步委托(APAPM)

8异步和多线程

委托泛型委托异步委托(新人,有问题请指出,有部分代码是拿其他博客主的)

对“xxx”类型的已垃圾回收委托进行了回调。这可能会导致应用程序崩溃损坏和数据丢失。向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。 错误解决一例。(代码片段