Async异步和Task多线程异步
一、引言
嗯,由于自己的无知和对知识有点一知半解的陋习下,使自己一直纠结于这样的一个问题:究竟什么是异步,在C#中究竟是async定义了异步,还是使用了Task本身就是异步?很明显,在这样的问题下,觉得自己真的有点犯二。原本这样的问题的解释根本不存在,原因是:自己啊,对知识理解不透彻,又怎么可能想明白。所以,经过一番代码运行作为比较,终于明白了其中的意含义,暫抒己见,还望路过的大神能够指点一二,万分感谢!
二、什么是异步
异步的含义其实很简单,比如我们定义一段代码,不必等前面所有的代码执行完,才开始执行某一段代码,就好像,不必等到饭熟了才开始炒菜,大概的意思就是这么一回事,就比如下面这样一段代码,不必等调用的函数体执行完了,才输出结束,这就是异步!
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始");
WriteAsync();
Console.WriteLine("结束");
Console.ReadKey();
}
static void WriteAsync()
{
Task.Run(() => {
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"AsyncTestMethod"+" "+i);
Thread.Sleep(10);
}
});
}
}
三、什么是Task
Task确实是一个很神秘的东西,但从根本上说,其实就是开启线程上的任务,即:允许多个任务可以有多个线程(或在同一线程内)进行,不必等到上一个任务执行完,才开始执行下一个任务,很直观的说,就是我在跑步的同时,不影响我也在听音乐!就好像,我在运行QQ的时候,不影响酷狗也在播放音乐!就比如下面的代码,我在比较值的同时,同时也在对该值得进行输出,二者同时进行!
class Program
{
static void Main(string[] args)
{
Task.Run(() => {
for (int i = 0; i < 10; i++)
{
Console.WriteLine(i + "<3" + " " + (i < 3));
Thread.Sleep(10);
}
});
Task.Run(() => {
for (int i = 0; i < 10; i++)
{
Console.WriteLine($"AsyncTestMethod" + " " + i);
Thread.Sleep(10);
}
});
Console.ReadKey();
}
}
四、async/await和Task异步详解
经过上面的阐述和代码验证,我们终于可以清楚的明白,异步和Task(多任务)本身就是两个不同的概念,异步是同时执行多个任务,而Task则是允许多个任务可以在线程内同时进行,多任务的同时进行,则是由异步来进行,而异步方法,必须为Task<T>。
1、不加await修饰
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始");
WriteAsync();
Console.WriteLine("结束");
Console.ReadKey();
}
static void WriteAsync()
{
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("T " + i);
}
});
Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("S " + i);
}
});
}
2、加await修饰
await的作用好比,我们在验证用户登录的情况下,用户名和密码验证通过后,才进行对用户信息完整读取,通过异步之间的await进行线程等待,避免不必要的资源被占用和浪费!
class Program
{
static void Main(string[] args)
{
Console.WriteLine("开始");
WriteAsync();
Console.WriteLine("结束");
Console.ReadKey();
}
static async void WriteAsync()
{
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("T " + i);
}
});
await Task.Run(() =>
{
for (int i = 0; i < 10; i++)
{
Console.WriteLine("S " + i);
}
});
}
}
到这里,总算梳理清楚,什么是异步,什么是Task了。但必须注意的一点是,在多个Task进行的情况下,务必要考虑线程安全的问题!好了,今天的分享就到这里,略抒己见,如有错误,还望有路过的高手,能够给予指导!!!