当前位置: 首页 > 知识库问答 >
问题:

NET 4.5中异步与同步的区别

芮建茗
2023-03-14

在启动时看到大量并发请求或负载激增(并发性突然增加)的web应用程序中,使这些web服务调用异步化将提高应用程序的响应能力。异步请求与同步请求所需的处理时间相同。例如,如果请求进行的web服务调用需要两秒钟才能完成,则无论同步执行还是异步执行,该请求都需要两秒钟。但是,在异步调用期间,线程在等待第一个请求完成时不会阻止其响应其他请求。因此,当有许多并发请求调用长时间运行的操作时,异步请求会阻止请求排队和线程池增长。

对于粗体字,我无法理解异步请求与同步请求处理所需的时间如何相同?

例如:

public async Task MyMethod()
{
    Task<int> longRunningTask = LongRunningOperation();
    //indeed you can do independent to the int result work here 

    //and now we call await on the task 
    int result = await longRunningTask;
    //use the result 
    Console.WriteLine(result);
}

public async Task<int> LongRunningOperation() // assume we return an int from this long running operation 
{
    await Task.Delay(1000); //1 seconds delay
    return 1;
}

假设代码变成这样:

public async Task MyMethod()
    {
        Task<int> longRunningTask = LongRunningOperation();
        //indeed you can do independent to the int result work here 
        DoIndependentWork();
        //and now we call await on the task 
        int result = await longRunningTask;
        //use the result 
        Console.WriteLine(result);
    }

    public async Task<int> LongRunningOperation() // assume we return an int from this long running operation 
    {
        DoSomeWorkNeedsExecution();
        await Task.Delay(1000); //1 seconds delay
        return 1;
    }

在这种情况下,在doIndependentWork()执行期间,LongRunningOperation()会由另一个线程执行吗?

共有1个答案

公良向阳
2023-03-14

异步操作并不更快。如果异步(即await task.delay(10000))或同步(即thread.sleep(10000))等待10秒,所需时间相同。唯一的区别是,第一个不会在等待时阻塞一个线程,而第二个会。

现在,如果您启动了一个任务,并且不等待它立即完成,您可以使用同一个线程来执行其他一些工作,但它不会“加速”异步操作的运行:

var task = Task.Delay(10000);
// processing
await task; // will complete only after 10 seconds

关于您的第二个问题:task.delay(像其他真正的异步操作一样)不需要执行线程,因此没有线程。task.delay是使用system.threading.timer来实现的,当它启动时,它会引发一个事件,同时它不需要线程,因为没有代码要执行。

因此,当运行mymethod的线程到达await longrunningtask时,它将被释放(只要longrunningtask尚未完成)。如果它是threadpool线程,它将返回threadpool,在那里它可以处理应用程序中的一些其他代码。

关于更新,流程如下:

  • MyMethod开始处理
  • LongRunningOperation开始处理
  • doSomeWorkNeedsExecution在调用线程上执行
  • longrunningoperation中到达await,因此返回热门任务。
  • DoIndependentWork由同一个调用线程执行(LongRunningOperation仍在“运行”,不需要线程)
  • MyMethod中到达Await。如果原始任务已完成,则相同的线程将同步进行,否则将返回一个最终完成的热任务。

因此,使用async-await的事实允许您使用一个线程,否则该线程将被阻塞,并同步等待执行CPU密集型工作。

 类似资料:
  • 问题内容: 由于Servlet 3.0 支持异步处理。使用始终异步处理会更好吗?或者在什么情况下同步处理更好? 问题答案: 异步Servlet带来的最大好处是HTTP push ,在该服务器中,服务器可以在选择时向客户端发送信息,而不是在客户端请求时将信息发送回客户端。在异步Servlet之前,这将需要长时间运行的HTTP连接,每个HTTP连接都会束缚服务器线程,这是非常低效的。这个新模型使服务器

  • 主要内容:同步时钟,实例,实例,异步时钟关键词: 同步,异步 由第 3 章可知,当触发器输入端的数据和触发器的时钟不相关时,很容易导致电路时序不满足。本章主要解决模块间可导致时序 violation 的异步问题。 关于异步与同步的定义,许多地方都有介绍,细节上也有所差异。本章主要的关注点是解决异步问题的方法,而不关心为什么会出现异步时钟,也不关心异步电路的具体结构,仅从异步时钟的时序结果去分析解决问题。 同步时钟 数字设计中,一般认为,

  • 本文向大家介绍同步和异步传输之间的区别,包括了同步和异步传输之间的区别的使用技巧和注意事项,需要的朋友参考一下 在数字电子设备中,同步传输和异步传输都是串行数据传输的一种类型,其中,基于用于同步的时钟脉冲,数据在发送方和接收方之间进行传输。 以下是同步传输和异步传输之间的重要区别- 序号 键 同步传输 异步传输 1 定义 同步传输是一种传输类型,其中在发送器和接收器之间共享一个公共时钟脉冲以允许同

  • 问题内容: 我该如何做这项工作 我试图从异步之一获取同步功能,我需要它来使用FreeTds异步查询作为同步之一 问题答案: 使用deasync-用C ++编写的模块,它将Node.js事件循环暴露给JavaScript。该模块还公开了一个函数,该函数阻止后续代码,但不阻止整个线程,也不引起繁忙的等待。您可以将函数放入循环中:

  • 本文向大家介绍同步和异步计数器之间的区别,包括了同步和异步计数器之间的区别的使用技巧和注意事项,需要的朋友参考一下 众所周知,在数字电子学中,计数器是由一系列触发器组成的顺序逻辑电路,用于按负或正边沿跳变来计数输入出现的次数。现在,基于触发器的触发方式,我们可以区分同步计数器和异步计数器。 以下是同步计数器和异步计数器之间的重要区别。 序号 键 同步计数器 异步计数器 1 触发 顾名思义,在使用同

  • 问题内容: 当我使用of方法时,和之间有什么区别? 问题答案: Mozilla开发人员:同步和异步请求 支持同步和异步通信。但是,一般而言,出于性能方面的考虑,异步请求应比同步请求优先。 简而言之,同步请求会阻止代码执行,并可能泄漏内存和事件。这可能会导致严重的问题。使用同步请求的唯一可行理由是更轻松地促进其中的下载。