创建线程之异步委托

首先定义一个runtaketime委托:

public delegate int runtaketime(int data,int ms);

定义一个静态的方法,参数,返回类型和定义的委托一样
static public int taketime(int data, int ms)
{
Console.WriteLine("time begin!");
Thread.Sleep(ms);
Console.WriteLine("time end!");
return data++;
}

1.投票,检查委托是否完成了它的任务

main()函数代码:
runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
IAsyncResult ar = a.BeginInvoke(2, 3000, null, null);//异步调用该委托中的方法,返回IAsyncResult

//while循环和委托中的方法一块执行,但是end方法后面的代码必须等到委托中方法执行完毕才可以执行
while (!ar.IsCompleted)//判断委托是否完成了任务
{
Thread.Sleep(50);
Console.Write(".");
}
int result = a.EndInvoke(ar);//endinvoke()方法的返回值与其同步副本(委托中的方法)的返回值相同,参数为IAsyncResult

Console.WriteLine("result:{0}",result);

2.等待句柄,另一种等待异步委托执行的方式是使用与IasyncResult相关联的句柄

main()函数代码:

runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
IAsyncResult ar = a.BeginInvoke(2, 3000, null, null);//异步调用该委托中的方法,返回IAsyncResult

//IasyncWaitHandle属性可以访问等待句柄,他返回一个WaitHandle对象,可以等待委托线程完成其任务
//WaitOne()方法中的参数为要等待的最长时间,如果超时则返回false,循环继续执行
while (!ar.AsyncWaitHandle.WaitOne(50))
{
 Console.Write(".");
 Thread.Sleep(50);
}

int result = a.EndInvoke(ar);//endinvoke方法的返回值与其同步副本(委托中的方法)的返回值相同,参数为IAsyncResult
Console.WriteLine("result:{0}",result);

3.异步回调是等待委托的结果的第三种方式

main()函数代码:

runtaketime a = new runtaketime(taketime);//把taketime方法加载到委托中
IAsyncResult ar = a.BeginInvoke(2, 3000, runtimecallback, a);//只要runtaketime委托完成任务,就会调用runtimecallback方法,参数a向异步操作完成时调用的方法传递特定的状态信息,即参数IAsyncResult ar
//在委托线程没有完成之前,不能结束主线程
for (int i = 0; i < 100; i++)
{
Thread.Sleep(50);
Console.Write(".");
}

runtimecallback()方法:

static void runtimecallback(IAsyncResult ar)
{
runtaketime a = ar.AsyncState as runtaketime;//把ar.AsyncState转换为runtaketime类型
Trace.Assert(a != null, "someting wrong!");//检查条件;如果条件为 false,则输出指定消息,并显示一个消息框,其中会显示调用堆栈。
int result = a.EndInvoke(ar);
Console.WriteLine("result:{0}", result);
}

创建线程之异步委托

时间: 2024-10-16 18:49:39

创建线程之异步委托的相关文章

01-多线程及异步委托

一.多线程: 1.概念: 线程:是Windows任务调度的最小单位.线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针.程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数. 多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务(代码),也就是说允许单个程序创建多个并行执行的线程来完成各自的任务. 2.为什么要用多线程: ①让计算机"同时"做多件事情,节约时间. ②多线程可以让一个程序“同时”处理多个事情. ③后台运行程序,

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

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

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

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

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

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

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

线程池 异步I/O线程 &lt;第三篇&gt;

在学习异步之前先来说说异步的好处,例如对于不需要CPU参数的输入输出操作,可以将实际的处理步骤分为以下三步: 启动处理: 实际的处理,此时不需要CPU参数: 任务完成后的处理: 以上步骤如果仅仅使用一个线程,当线程正在处理UI操作时就会出现“卡”的现象. 如果使用异步的处理方式,则这三步处理过程涉及到两个线程,主线程中启动第一步:第一步启动后,主线程结束(如果不结束,只会让该线程处于无作为的等待状态):第二步不需要CPU参与:第二步完成之后,在第二个线程上启动第三步:完成之后第二个线程结束.这样

线程:主线程、子线程 同步线程、异步线程 单线程、多线程 System.Threading与System.Windows.Threading

入门-------------------------------------------------------------------------------- 概述与概念    一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建. 创建和开始使用多线程    public Window1()    {        //主线程         //Code……        //使用匿名方法来启动子线程        Thread t = new Th

ThreadPool.QueueUserWorkItem引发的血案,线程池异步非正确姿势导致程序闪退的问题

ThreadPool是.net System.Threading命名空间下的线程池对象.使用QueueUserWorkItem实现对异步委托的先进先出有序的回调.如果在回调的方法里面发生异常则应用程序会出现闪退.当然是指不处理那个异常的情况下.这不公司的CMS在生产环境频频出现闪退的情况.该死的是,原来用老机器配置不高的情况下没有出现过.换了更好的新机器后出现的. // // 摘要: // 将方法排入队列以便执行,并指定包含该方法所用数据的对象.此方法在有线程池线程变得可用时执行. // //