可以使用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: }
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#高级编程》
如需学习,请异步原作者博客查看。