.Net4.5中异步和同步的区别当我阅读.Net4.5async异步编程和await关键字时,我在这里阅读了下面这段HandlingAsynchronousRequests中在启动时看到大量并发请求或出现突发负载(并发量突然增加)的Web应用程序,使这些Web服务调用异步将提高应用程序的响应能力。异步请求与同步请求的处理时间相同。例如,如果请求发出需要两秒才能完成的Web服务调用,则无论是同步执行还是异步执行,请求都需要两秒。但是,在异步调用期间,线程在等待第一个请求完成时不会被阻止响应其他请求。因此,当有许多并发请求调用长时间运行的操作时,异步请求可防止请求排队和线程池增长。粗体字,我看不懂他们异步请求怎么和同步请求耗时一样?例如:publicasyncTaskMyMethod(){TasklongRunningTask=LongRunningOperation();//实际上你可以在这里做独立于int结果的工作//现在我们在任务上调用awaitintresult=awaitlongRunningTask;//使用结果Console.WriteLine(result);}publicasyncTaskLongRunningOperation()//假设我们从这个长时间运行的操作中返回一个int{awaitTask.Delay(1000);//1秒延迟返回1;我对LongRunningOperation()的理解从第一行开始调用在这里执行TasklongRunningTask=LongRunningOperation();一旦调用await返回值,那么从我的角度来看,异步代码比同步代码快,是吗?另一个问题:据我所知,执行MyMethod()的主线程并没有阻塞等待LongRunningOperation()完成,而是返回到线程池以服务于另一个请求。那么是否有另一个线程分配给LongRunningOperation();执行它?如果是,那么异步编程和多线程编程有什么区别?更新:假设代码变成这样:publicasyncTaskMyMethod(){TasklongRunningTask=LongRunningOperation();//实际上,您可以在此处独立于int结果工作DoIndependentWork();//现在我们在任务上调用awaitintresult=awaitlongRunningTask;//使用结果Console.WriteLine(result);}publicasyncTaskLongRunningOperation()//假设我们从这个长时间运行的操作中返回一个int{DoSomeWorkNeedsExecution();等待Task.Delay(1000);//1秒延迟返回1;这样的话,在DoIndependentWork()执行过程中,LongRunningOperation()会被另一个线程执行吗?异步操作并不快。如果您异步等待10秒(即awaitTask.Delay(10000))或同步等待(即Thread.Sleep(10000)),它将花费相同的10秒。唯一的区别是第一个在等待时不会持有线程,但第二个会。现在,如果您开始任务并且不等待它立即完成,您可以使用同一个线程来做其他工作,但它不会“加速”异步操作:vartask=Task.Delay(10000);//处理等待任务;//将在10秒后完成关于你的第二个问题:Task.Delay(像其他真正的异步操作一样)不需要线程来执行,所以没有线程。Task.Delay是使用您启动的System.Threading.Timer实现的,在它完成时引发一个事件,同时它不需要线程,因为没有要执行的代码。因此,当运行MyMethod的线程到达awaitlongRunningTask时,它会被释放(只要longRunningTask尚未完成)。如果是ThreadPool线程,则返回ThreadPool,ThreadPool可以处理应用程序中的其他代码。关于更新,流程是这样的:因此,您使用async-await的事实允许您使用一个线程,否则该线程将被阻塞以同步执行CPU密集型工作。考虑以下之间的区别:Thread.Sleep(1000);并等待Task.Delay(1000);两者都需要一秒钟才能运行。但在前一种情况下,当前线程将被阻塞(并且它的所有资源都没有用),而在后一种情况下,当前线程可以做其他有用的事情(例如服务于另一个请求)。异步性不是关于加速单个指令序列,而是能够在同步代码块的同时执行操作。回复。另一个问题释放的线程将用于其他事情;在操作完成之前不会分配线程。这是可能的,因为底层操作系统本质上是异步的。在上面的示例中,使用了一个计时器来通知线程空闲时,而不是内部停止的线程。(基于I3arnon的回答)同步使用async-await的操作和操作总体上花费的时间相同并不是绝对可靠的。async-await中有一些额外的逻辑。检查已完成的服务员和状态机。这使得一些异步操作比相应的同步操作花费更长的时间。另一方面,大多数适用于async-await的操作天生就是异步的,并且还需要一些额外的处理才能使它们看起来和感觉起来是同步的。在这些情况下,异步操作比同步操作花费的时间更少。有问题的参考资料是关于网络应用程序的。对于Web应用程序,异步操作更多的是在可接受的时间内为最大数量的请求提供服务,而不是为每个请求节省几微秒。另一方面,如果涉及上下文切换,最终会花费更多时间,这就是为什么在Web应用程序中使用Task.Run对应用程序来说效果更差。如果您想了解有关async-awit的更多信息,请阅读我关于async-awit管理的文章。以上就是《C#学习教程:.net4.5中异步和同步的区别》的全部内容。代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
