zoukankan      html  css  js  c++  java
  • C#异步编程研究学习(一)

    可以使用Func<T>或者Action<T>简单实现如:

     Func<string, string,string,string, int> func = new Func<string, string, string,string,int>(OrderManager.CallWebService);
     func.BeginInvoke(orderCode, "0",userLoginName,ipAddress, null,resultCode);

    这样直接就将方法改为异步的了。

    Func<T>和Action<T>是.netFramework提供的委托,有很多重载。

    区别是Func<T>有返回参数,Action<T>没有返回参数。

    上面的例子:null是回调函数,可以定义一个回调函数,让方法执行完毕后在回调函数中做一些通知或者其他事情。

    当Func<T>和Action<T>和不满足要求时,可以自定义委托,然后现实异步。

    第二种使用:.Net Framework 4.0新增的System.Threading.Tasks命名空间下的Task类。

    new一个Task类的对象,可以开启一个任务:

    Task task = new Task(TaskMethod);
    task.Start();

    Task类有个静态属性Factory,这个属性返回一个TaskFactory对象。将方法传递给StartNew方法,任务会立即启动。

    System.Threading.Tasks.Task.Factory.StartNew(() => OrderManager.CallWebService(orderCode, "0"));

    第二种方法摘抄自:C#异步编程的实现方式(4)——Task任务

    您可以到这篇文章阅读,更简单明了的说明。

    第三种:ThreadPool

    利用ThreadPool也可以实现异步操作。

    static void Main(string[] args)
     {
         for (int i = 1; i <= 3; i++)
          {
             ThreadPool.QueueUserWorkItem(WaitCallBackMethod, i);
          }
          Console.Read();
      }

    该文照抄自:C#异步编程的实现方式(3)——ThreadPool线程池

    第四种:使用Thread

    Thread thread3 = new Thread(ThreadMethod3);
     thread3.Start(new ThreadData() { Message = "Hello world!" });

    Thread可以传递一个Object参数,可以在object中封装你需要的任何参数。

    第五种方法:C#异步编程的实现方式(1)——异步委托

    感觉这种方法很强大,只是还没用过。

    1)通过IsCompleted属性来判断该委托是否执行完成。

       1: static void Imp1()
       2: {
       3:     MyDelegate dl = DelegateMethod;
       4:  
       5:     IAsyncResult ar = dl.BeginInvoke(5000, null, null);
       6:  
       7:     while (!ar.IsCompleted)
       8:     {
       9:         Console.Write(".");
      10:         Thread.Sleep(50);
      11:     }
      12:     string result = dl.EndInvoke(ar);
      13:     Console.WriteLine("result: {0}", result);
      14: }

    2、等待句柄(AsyncWaitHandle属性)

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

       1: static void Imp2()
       2: {
       3:     MyDelegate dl = DelegateMethod;
       4:  
       5:     IAsyncResult ar = dl.BeginInvoke(5000, null, null);
       6:     while (true)
       7:     {
       8:         Console.Write(".");
       9:         if (ar.AsyncWaitHandle.WaitOne(50))
      10:         {
      11:             Console.WriteLine("Can get the result now");
      12:             break;
      13:         }
      14:     }
      15:     string result = dl.EndInvoke(ar);
      16:     Console.WriteLine("result: {0}", result);
      17: }
    主线程每等待50秒做一次判断是否完成。
     
    3、异步回调(AsyncCallBack委托)
    BeginInvoke方法第二个参数可传入一个AsnycCallBack委托类型的方法,当异步调用完成时会执行这个方法。我们可以用Lambda表达式来实现:
       1: 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: }

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

    参考资料:《C#高级编程》

    第六种:C#异步编程的实现方式(5)——连续任务

    如需学习,请异步原作者博客查看。

  • 相关阅读:
    发改委-国资委
    IE6 — 你若安好,便是晴天霹雳 [ 乱弹 ]
    Java实现LeetCode_0001_Two Sum
    Java实现LeetCode_0014_LongestCommonPrefix
    Java实现LeetCode_0014_LongestCommonPrefix
    Java实现LeetCode_0007_ReverseInteger
    Java实现LeetCode_0007_ReverseInteger
    Java实现LeetCode_0007_ReverseInteger
    Java实现LeetCode_0014_LongestCommonPrefix
    Java实现LeetCode_0014_LongestCommonPrefix
  • 原文地址:https://www.cnblogs.com/Tpf386/p/6709538.html
Copyright © 2011-2022 走看看