C#异步的世界(上)

这篇文章主要介绍了C#异步的世界,对异步感兴趣的同学,可以参考下

这个代码需要20秒。

如果是异步:


var task = Task.Run(() =>
{
    Thread.Sleep(10000);//假设这是个访问数据库的方法
});
Thread.Sleep(10000);//假设这是个访问翻墙网站的方法
task.Wait();

如此就只要10秒了。这样就节约了10秒。

如果是:


var task = Task.Run(() =>
{
    Thread.Sleep(10000);//假设这是个访问数据库的方法
}); 
task.Wait();

异步执行中间没有耗时的代码那么这样的异步将是没有意思的。

或者:


var task = Task.Run(() =>
{
    Thread.Sleep(10000);//假设这是个访问数据库的方法
}); 
task.Wait();
Thread.Sleep(10000);//假设这是个访问翻墙网站的方法

把耗时任务放在异步等待后,那这样的代码也是不会有性能提升的。

还有一种情况:

如果是单核CPU进行高密集运算操作,那么异步也是没有意义的。(因为运算是非常耗CPU,而网络请求等待不耗CPU)

问题3:线程的使用数量和CPU的使用率有必然的联系吗

答案是否。

还是拿单核做假设。

情况1:


long num = 0;
while (true)
{
    num += new Random().Next(-100,100);
    //Thread.Sleep(100);
}

单核下,我们只启动一个线程,就可以让你CPU爆满。

一千多个线程,而CPU的使用率竟然是0。由此,我们得到了之前的结论,线程的使用数量和CPU的使用率没有必然的联系。

虽然如此,但是也不能毫无节制的开启线程。因为:

  • 开启一个新的线程的过程是比较耗资源的。(可是使用线程池,来降低开启新线程所消耗的资源)
  • 多线程的切换也是需要时间的。
  • 每个线程占用了一定的内存保存线程上下文信息。

以上就是C#异步的世界(上)的详细内容,更多关于C#异步的世界的资料请关注得得之家其它相关文章!

本文标题为:C#异步的世界(上)