zoukankan      html  css  js  c++  java
  • 异步调用的两种方式

    最近因为项目需要使用异步执行方法,特意查了一下这方面的资料,整理一下。

    第一种方法使用的.net 2.0 所实现异步方法,可以做一些简单的异步处理,实现传入和传出参数.

    第二种方法是使用自定义线程处理,适合处理复杂,可控的逻辑操作

    下面是一个小小的示例,简单演示使用方法:

    1. 使用BeginInvoke 实现异步方法调用
          
       1 using System;
       2 using System.Windows.Forms;
       3 using System.Threading;
       4 
       5 
       6 // 使用BeginInvoke 实现异步方法调用 (带传入,传出参数)
       7 public class BeginInvokeTest
       8 {
       9     //返回数据委托方法
      10     private delegate int MyMethod(int e);
      11 
      12     public void mian()
      13     {
      14         MyMethod myMethod = method;
      15         //调用异步方法,传入委托方法参数,完成后执行方法,委托实例
      16         //返回异步执行接口
      17         IAsyncResult asyncResult = myMethod.BeginInvoke(1000, MethodCompleted, myMethod);
      18 
      19     }
      20 
      21     //数据返回执行方法
      22     private int method(int sleepTime)
      23     {
      24         //做一些操作
      25         Thread.Sleep(sleepTime);
      26 
      27         //返回需要返回的数据,返回0
      28         return 0;
      29     }
      30 
      31     /// <summary>
      32     /// 异步完成执行方法
      33     /// </summary>
      34     /// <param name="asyncResult"></param>
      35     private void MethodCompleted(IAsyncResult asyncResult)
      36     {
      37         if (asyncResult == null)
      38         {
      39             return;
      40         }
      41 
      42         //接受返回数据 0
      43         int result = (asyncResult.AsyncState as MyMethod).EndInvoke(asyncResult);
      44     }
      45 
      46 }
      自定义线程实现异步方法调用 (带传入,传出参数)
          
       1 using System;
       2 using System.Windows.Forms;
       3 using System.Threading;
       4 
       5 //使用多线程方法 实现异步方法调用 (带传入,传出参数)
       6 namespace Wim.Tool
       7 {
       8     //定义返回数据委托
       9     public delegate void ResultEventHandler(int i);
      10 
      11     /// <summary>
      12     /// 数据库 调用主体方法
      13     /// </summary>
      14     public class WimSqlClient
      15     {
      16         /// <summary>
      17         /// 获取异步返回值处理方法
      18         /// </summary>
      19         /// <param name="i"></param>
      20         private static void ResultEventMethod(int i)
      21         {
      22             // TODO: 异步存储数据库返回值处理方法
      23         }
      24 
      25         /// <summary>
      26         /// 异步调用 SQL处理方法
      27         /// </summary>
      28         /// <param name="optCode"></param>
      29         /// <param name="userInfo"></param>
      30         /// <param name="optParam"></param>
      31         public void CreateAsyncService(string optCode, string userInfo, string optParam)
      32         {
      33 
      34             //实例化WimThreadState类,为线程提供参数
      35             WimThreadState tws = new WimThreadState(optCode, userInfo, optParam, new ResultEventHandler(ResultEventMethod));
      36 
      37             // 创建执行任务的线程,并执行
      38             Thread t = new Thread(new ThreadStart(tws.GetResult));
      39             t.IsBackground = true;
      40             t.Start();
      41         }
      42     }
      43 
      44     /// <summary>
      45     /// 数据库处理类
      46     /// </summary>
      47     public class WimThreadState
      48     {
      49         private const string siteInfo = "WIM";
      50         private ResultEventHandler resultEventHandler;
      51 
      52         //要用到的属性,也就是我们要传递的参数
      53         private string optCode;
      54         private string userInfo;
      55         private string optParam;
      56 
      57         //包含参数的构造函数
      58         public WimThreadState(string optCode, string userInfo, string optParam, ResultEventHandler resultEventHandler)
      59         {
      60             this.optCode = optCode;
      61             this.userInfo = userInfo;
      62             this.optParam = optParam;
      63             this.resultEventHandler = resultEventHandler;
      64         }
      65 
      66         /// <summary>
      67         /// 请求数据库,返回受影响行数
      68         /// </summary>
      69         public void GetResult()
      70         {
      71             // TODO: 需要异步处理的方法
      72         }
      73     }
      74 }
  • 相关阅读:
    《构建之法》读后感 二
    求数组最大子数组的和(循环数组)
    求数组最大子数组的和
    《构造之法》阅读笔记一
    2019春季学期学习进度报告(一)
    软件工程开课博客
    个人NABCD
    《构建之法》阅读笔记02
    大二下学期学习进度(六)
    《构建之法》阅读笔记01
  • 原文地址:https://www.cnblogs.com/elaky/p/1628169.html
Copyright © 2011-2022 走看看