.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 }
时间: 2024-11-05 08:20:42

.NET异步委托的相关文章

异步委托(APM)使用Func异步操作,处理耗时操作

使用委托进行异步操作,处理一些耗时操作,防止主线程阻塞 使用例子: 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Demo 7 { 8 class Program 9 { 10 11 static void Main(string[] args) 12 { 13 Func<string> fun = new Func<s

C#基础之--线程、任务和同步:一、异步委托

创建线程的一种简单方式是定义一个委托,并异步调用它.委托是方法的类型安全的引用. Delegate还支持异步地调用方法.在后台Delegate类会创建一个执行任务的线程. 为了说明委托的异步特性,从一个需要一定的时间才能执行完毕的方法开始. TakesAWhile方法至少需要经过第2个变量传递的毫秒数才能执行完,因 为它调用了Thread.Sleep()方法. static int TakesAWhile(int data, int ms) { Console.WriteLine("TakesA

C#: 异步委托

http://www.cnblogs.com/yingzhongwen/p/4568350.html 讲了委托与事件,但是对异步委托研究得还不够深入. http://www.cnblogs.com/lxblog/archive/2012/12/11/2813893.html http://www.cnblogs.com/IAmBetter/archive/2012/02/13/2348912.html http://blog.csdn.net/lexiaoyao20/article/detail

C#固定时间执行指定事件(观察者模式+异步委托)

最近有个项目需要每天固定的时间去执行指定的事件,发现网上关于这样的文章比较少,而且比较散.通过学习了几篇文章后终于实现了这个功能,在此也特别感谢这些文章的作者们,这也是我第一次在园子里面发文章,望多指教. 关于观察者模式,我在这里就不做讲解了,如有不懂,可以参考相关文章. 那么开始入正题. 主要有三个页面:Observer.cs(观察者).Subject.cs(通知者).Form1.cs Observer.cs class Observer { /// <summary> /// 执行事件A

使用异步委托执行线程(delegate)

由于异步委托产生的线程与应用程序主线程是分开执行的,若主线程要获取异步委托线程的结果,则主线程需要等待异步委托的执行结果. BeginInvoke是Delegate类型的一个方法,它的返回类型为IAsyncResult,通过该接口,可以获得异步委托的执行信息. 1.投票技术:等待异步委托结果的一种方法是投票技术,该技术的实现原理是通过IAsyncResult接口的IsComplete属性来检查委托是否完成了任务.EndInvote方法获取执行结果.举个例子,如下: 执行后的效果: 2.访问等待句

C# 多线程操作之异步委托

标签: 多线程任务nullstringhtml工作 2012-06-29 23:00 1276人阅读 评论(0) 收藏 举报  分类: C/C++/C#/dotnet(126)  目录(?)[+] 在应届生找工作的时候,多线程操作几乎是所有的公司都会问及的一个基本问题. 这里做了一个多线程操作的总结,这里总结了通过异步委托来实现多线程操作. 定义一个委托,是创建一个线程的最简单的方法,并且异步调用它.委托是方法的类型安全的引用.同时委托还智齿异步调用方法. 委托使用线程池来完成异步任务. 当自己

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

委托 是把一个方法当作一个参数放到声明(deletgate)委托中.给另一个方法时候,或者直接执行委托. 1 class Delegates 2 { 3 public delegate void mydelegate(string msg); 4 static void Main(string[] args) 5 { 6 mydelegate myd = new mydelegate(father.BuyToys); 7 myd("BBB"); 8 Console.Read(); 9

.NET委托解析(异步委托)

上一篇我们了解到了,委托的基本感念,列举了几个委托的实例,并根据实例来反编译源码查看.NET 委托的内部实现,从浅入深的角度来详细的去解析委托的实质,本文将系上篇继续讨论异步委托的实现以及异步委托的源码解析. 首先本文只会从委托的层面的去编写,不会涉及到深层次的异步.(后续的系列中将会对异步进行深入讲解.敬请关注.). 委托的异步调用方式 在上一篇中我们在实例中是直接通过委托对象的,例如: private static void Main(string[] args)  {        Pro

c#并行任务多种优化方案分享(异步委托)

遇到一个多线程任务优化的问题,现在解决了,分享如下. 假设有四个任务: 任务1:登陆验证(CheckUser) 任务2:验证成功后从Web服务获取数据(GetDataFromWeb) 任务3:验证成功后从数据库获取数据(GetDatFromDb) 任务4:使用2.3的数据执行一个方法 (StartProcess) 一个比较笨的方法(本人最开始的方法,记为方法1)是直接开启一个线程,按照顺序依次执行四个任务: new Thread(delegate                {        

异步委托

委托实现多窗体传值 主窗体的代码: public partial class FrmMain : Form { //[3] 创建委托对象(委托对象能够将委托和具体方法关联) public ShowCounterDelegate msgSender; public FrmMain() { InitializeComponent(); //创建从窗体对象 FrmOther01 objFrm01 = new FrmOther01(); FrmOther02 objFrm02 = new FrmOthe