码迷,mamicode.com
首页 > 其他好文 > 详细

C#实现异步编程的两个简单机制

时间:2014-07-16 17:36:58      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:使用   os   io   代码   re   line   

理解程序、进程、线程三者之间的区别:简而言之,一个程序至少有一个进程,一个进程至少有一个线程
进程就是在内存中运行的程序(即运行着的程序);一个进程一般只有一个线程,一个进程可以包含多个线程(多线程编程);

使用异步编程的简单机制一:异步委托
    委托类型的BeginInvoke和EndInvoke方法。
        BeginInvoke方法:
            参数组成:引用方法的参数列表+callback参数+state参数
            返回值:IAsyncResult接口类型(接口介绍:这个接口有两个重要属性:IsCompleted属性 bool类型 表示异步线程(方法)是否执行完成;AsyncState。
            这个接口是AsyncResult类的一个成员,这个类还有一个重要的成员:AsyncDeleget 返回被调用的委托的引用)
            
            方法被调用时做了哪些事:
            1.在线程池中获取一个线程,当这个线程被调度时,执行委托列表方法;
            2.返回给主线程一个IAsyncResult对象的引用;
            
        EndInvoke方法:
            参数组成:IAsyncResult类型
            返回值:被调用的委托的返回值类型
            
             方法被调用时做了哪些事:
             根据参数:IAsyncResult对象找到关联的线程,
             如果这个线程已经执行完毕,EedInvoke做如下有些事:清理线程的状态和资源;找到引用方法的返回值,并把它作为自己的返回值返回。
             如果这个线程没有执行完毕,调用线程就会停止并等待,知道清理完成并返回值。
            

异步编程的三者模式:等待直到完成模式、轮询模式、回调模式.
下面给个回调模式的列子:
    public class TestThreading
    {
        public static int Method(int n, int m)
        {
            Console.WriteLine("异步方法内部开始");
            System.Threading.Thread.Sleep(5000);
            return n > m ? n : m;
        }

        public static void CallBack(IAsyncResult ia)
        {

            AsyncResult ar = (AsyncResult)ia;
            MyDel del = (MyDel)ar.AsyncDelegate;
            int result = del.EndInvoke(ia);
            Console.WriteLine(result);

        }
    }
    
    static void Main(string[] args)
    {
            #region 异步编程与线程
            
            Console.WriteLine("Main中的处理代码。。。。。");
            MyDel del = new MyDel(TestThreading.Method);
            Console.WriteLine("BeginInvoke 方法调用之前");
            IAsyncResult ia = del.BeginInvoke(32, 100, TestThreading.CallBack, null);
            Console.WriteLine("BeginInvoke调用之后,Main继续做别的事情");
            System.Threading.Thread.Sleep(5000);
            Console.WriteLine("Main 程序结束");
            
            #endregion
    }
    
使用异步编程的简单机制二:计时器
.Net BCL 提供了好几个Timer类,在这里我只介绍System.Threading中的Timer
首先看下Timer最常用的构造函数:
Timer(TimerCallback callback,objec state,int dueTime,int period)

下面分别介绍下各个参数,介绍完了你就会用Timer实现异步编程了:
TimerCallback 是一个委托类型,定义如下   void TimerCallback(object state) 这个就是回调函数,计时器在每次时间到时执行回调方法
state 就是要传给回调方法的参数
dueTime 就是回调方法在第一次被执行之前的时间
period 是两次调用回调方法之间的时间间隔

Demo如下:

    public class TestTimer
    {
        public static void TimerCallBack(object o)
        {
            Console.WriteLine("{0},{1}",o,DateTime.Now.ToString("yy:MM:dd HH:mm:ss"));
        }
    }
    
     static void Main(string[] args)
    {
    
        #region Timer类的使用(System.Threading下的)使用Timer发异步(回调函数)

        Timer time = new Timer(TestTimer.TimerCallBack, "lxf", 5000, 1000);

        #endregion
    }

C#实现异步编程的两个简单机制,布布扣,bubuko.com

C#实现异步编程的两个简单机制

标签:使用   os   io   代码   re   line   

原文地址:http://www.cnblogs.com/lxf1117/p/3847823.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!