C#异步编程,这里列举一下几种方式:
1、通过委托来实现异步(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法);
2、task(.net 4.0 新特性);
3、await async (.net4.5新特性);
下面看示例:
一、通过委托来实现异步
class Program { static void Main(string[] args) { //通过委托来实现异步编程的(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法) string i = "参数"; Console.WriteLine("调用异步方法前"); PostAsync(i); Console.WriteLine("调用异步方法后"); Console.ReadKey(); } #region 通过委托来实现异步编程的(在委托类型中定义了BeginInvoke()和EndInvoke()两个方法) delegate void AsyncFoo(string i); private static void PostAsync(object i) { AsyncFoo caller = Myfunc; caller.BeginInvoke(i.ToString(), FooCallBack, caller); } //回调方法 private static void FooCallBack(IAsyncResult ar) { var caller = (AsyncFoo)ar.AsyncState; caller.EndInvoke(ar); } ////// 执行业务逻辑的方法 /// ///调用异步时传过来的参数 private static void Myfunc(string i) { Console.WriteLine("通过委托来实现异步编程的"); } #endregion }
运行结果(打印结果):
二、task(.net 4.0 新特性)
class Program { static void Main(string[] args) { Console.WriteLine("主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId); //Task方式一 Task task1 = new Task(() => TaskFunc1()); task1.Start(); //Task方式二 var result = Task.Run(() => { return TaskFunc2(); }); Console.WriteLine(result.Result); Console.ReadKey(); } #region task private static void TaskFunc1() { Console.WriteLine("Task方式一开启的线程ID:" + Thread.CurrentThread.ManagedThreadId); } private static string TaskFunc2() { return "Task方式二开启的线程ID:" + Thread.CurrentThread.ManagedThreadId; } #en
运行结果(打印结果):
三、await async (.net4.5新特性)
class Program { static void Main(string[] args) { Console.WriteLine("主线程,线程ID:" + Thread.CurrentThread.ManagedThreadId); var result1 = AsyncFunc1(); Console.WriteLine(result1.Result); Console.ReadKey(); } #region await async private static async TaskAsyncFunc1() { return await Task.Run(() => { Console.WriteLine("await/async线程ID: {0}", Thread.CurrentThread.ManagedThreadId); return "这是返回值"; }); } #endregion }
运行结果(打印结果):