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);
}
/// <summary>
/// 执行业务逻辑的方法
/// </summary>
/// <param name="i">调用异步时传过来的参数</param>
private static void Myfunc(string i)
{
Console.WriteLine("通过委托来实现异步编程的");
}
#endregion
}
运行结果(打印结果):
注意:PostAsync()方法也可以定义为包含两个以及两个以上的参数的方法如下:
class Program
{
static void Main(string[] args)
{
PostAsync("参数1", "参数2");
Console.ReadKey();
}
delegate void AsyncFoo(string i, string p);
private static void PostAsync(string i, string p)
{
AsyncFoo caller = Myfunc;
//FooCallBack,caller为额外的参数
caller.BeginInvoke(i, p, FooCallBack, caller);
}
private static void FooCallBack(IAsyncResult ar)
{
var caller = (AsyncFoo)ar.AsyncState;
caller.EndInvoke(ar);
}
private static void Myfunc(string i,string p)
{
Console.WriteLine(i);
Console.WriteLine(p);
}
}
二、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<string>(() => { 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 Task<string> AsyncFunc1()
{
return await Task.Run(() =>
{
Console.WriteLine("await/async线程ID: {0}", Thread.CurrentThread.ManagedThreadId);
return "这是返回值";
});
}
#endregion
}
运行结果(打印结果):
代码下载:https://download.csdn.net/download/coderk2014/10536843