首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >.net 4.5中异步与同步的区别

.net 4.5中异步与同步的区别
EN

Stack Overflow用户
提问于 2015-01-02 13:02:49
回答 3查看 50.7K关注 0票数 20

在阅读.Net 4.5 asyncawait关键字中的异步编程时,我阅读了以下段落:这里

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

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

例如,:

代码语言:javascript
运行
复制
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;
}

据我所知,LongRunningOperation()从这里调用Task<int> longRunningTask = LongRunningOperation();的第一行开始执行,并在调用await后返回值,所以从我的观点来看,异步代码比同步代码更快,对吗?

另一个问题:

我的理解是,执行MyMethod()的主线程不会阻止等待LongRunningOperation()的完成,但是它会返回到线程池来服务另一个请求。那么,是否有另一个线程分配给LongRunningOperation();来执行它?

,如果是,,那么异步编程和多线程编程有什么区别?

更新:

假设代码变成这样:

代码语言:javascript
运行
复制
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;
    }

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

EN

Stack Overflow用户

发布于 2015-01-02 17:33:50

(以I3arnon的答复为基础)

总的来说,使用async-await的同步操作和操作会占用相同的时间,这并不是绝对正确的。

async-await涉及到一些额外的逻辑。检查已完成的服务生和状态机。这使得一些异步操作比相应的同步操作花费更多的时间。

另一方面,大多数适合于async-await的操作都是自然异步的,需要一些额外的处理来使它看起来和感觉是同步的。在这些情况下,异步操作所花费的时间比同步对应的时间要少。

关于这个问题的引文与web应用程序有关。对于web应用程序,异步操作更多的是在可接受的时间内为最大数量的请求提供服务,而不是为每个请求节省几微秒。另一方面,如果涉及到上下文切换,则最终需要更多的时间,这就是为什么在web应用程序中使用Task.Run对应用程序来说弊大于利的原因。

如果您想了解更多关于async-awit的信息,请阅读策展人上的文章。

票数 2
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27742698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档