zoukankan      html  css  js  c++  java
  • C#异步编程的实现方式(1)——异步委托

    异步的实现即多线程,一种简单的方式就是创建一个委托,然后异步调用它。 .Net Framework已经为我们提供了委托的异步调用方法。下面介绍三种使用委托实现异步的方法。

    1、投票(IsCompleted属性)

    首先定义一个委托:

    public delegate string MyDelegate(int ms);

    Delegate类提供了BeginInvoke()方法,这个方法返回一个IAsyncResult接口,这个接口包含了该委托的相关信息,并且可以通过它的IsCompleted属性来判断该委托是否执行完成。下面是将要异步调用的方法:

        static string DelegateMethod(int ms)
    
        {
    
            Console.WriteLine("TakesAWhile started");
    
            Thread.Sleep(ms);
    
            Console.WriteLine("TakesAWhile completed");
    
            return "Hello world!";
    
        }

    下面是主线程的方法:

    static void Imp1()
     {
         MyDelegate dl = DelegateMethod;
         IAsyncResult ar = dl.BeginInvoke(5000, null, null);
         while (!ar.IsCompleted)
        {
             Console.Write(".");
             Thread.Sleep(50);
         }
    
        string result = dl.EndInvoke(ar);
        Console.WriteLine("result: {0}", result);
     }

    可以看到,委托线程执行5秒钟,主线程不停的循环判断委托线程是否完成(用IsCompleted属性判断)。如果没完成则断续打点,如果完成则跳出循环。用EndInvoke方法获取委托的返回值。如果方法未执行完,EndInvoke方法就会一直阻塞,直到被调用的方法执行完毕。

    2、等待句柄(AsyncWaitHandle属性)

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

    static void Imp2()
     {
         MyDelegate dl = DelegateMethod;
         IAsyncResult ar = dl.BeginInvoke(5000, null, null);
         while (true)
         {
             Console.Write(".");
             if (ar.AsyncWaitHandle.WaitOne(50))
             {
                Console.WriteLine("Can get the result now");
                break;
             }
         }
         string result = dl.EndInvoke(ar);
         Console.WriteLine("result: {0}", result);
     }

    主线程每等待50秒做一次判断是否完成。

    3、异步回调(AsyncCallBack委托)

    BeginInvoke方法第二个参数可传入一个AsnycCallBack委托类型的方法,当异步调用完成时会执行这个方法。我们可以用Lambda表达式来实现:

    static void Imp3()
     {
        MyDelegate dl = DelegateMethod;
         dl.BeginInvoke(5000, new AsyncCallback(ar =>
        {
            string result = dl.EndInvoke(ar);
             Console.WriteLine("result: {0}", result);
        }), null);
    
         for (int i = 0; i < 100; i++)
         {
            Console.Write(".");
             Thread.Sleep(50);
         }
    }

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

    转载:http://www.cnblogs.com/sosowjb/archive/2012/08/10/2631161.html 【共5篇】

    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: }
  • 相关阅读:
    垃圾回收相关概念
    垃圾回收相关算法
    垃圾回收概述
    StringTable
    执行引擎
    [前端]背景图,中间放大特效
    [Javascript]类数组对象为什么不能用for in进行遍历
    [前端] 画个圈圈显示百分比
    win10 Build 14905.rs_prerelease.160811-1739 填坑记录
    [翻译][10 By 10 外文博客] 01.uwp获得关注并安装
  • 原文地址:https://www.cnblogs.com/larva/p/7300121.html
Copyright © 2011-2022 走看看