最近因为项目需要使用异步执行方法,特意查了一下这方面的资料,整理一下。
第一种方法使用的.net 2.0 所实现异步方法,可以做一些简单的异步处理,实现传入和传出参数.
第二种方法是使用自定义线程处理,适合处理复杂,可控的逻辑操作
下面是一个小小的示例,简单演示使用方法:
- 使用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 }