为什么我应该使用异步操作而不是同步操作?

deu*_*uid 5 c# concept

我一直在思考这个问题.

假设我们使用HttpWebRequest类有一个简单的异步Web请求

class webtest1
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("www.google.com");

    public webtest1()
    {
        this.StartWebRequest();
    }

    void StartWebRequest()
    {
        webRequest.BeginGetResponse(new AsyncCallback(FinishWebRequest), null);
    }

    void FinishWebRequest(IAsyncResult result)
    {
        webRequest.EndGetResponse(result);
    }
}
Run Code Online (Sandbox Code Playgroud)

使用同步操作可以轻松实现相同的操作:

class webtest1
{
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create("www.google.com");

    public webtest1()
    {
        webRequest.GetResponse();
    }
}
Run Code Online (Sandbox Code Playgroud)

那么,当更简单的同步操作就足够时,为什么我还想使用更复杂的异步操作呢?要节省系统资源?

Tom*_*and 9

如果您发出异步请求,则可以在等待对请求的响应时执行其他操作.如果您发出同步请求,则必须等到收到回复后才能执行其他操作.

对于简单的程序和脚本,它可能并不重要,实际上在许多情况下,更容易编码和理解同步方法将是更好的设计选择.

但是,对于非平凡的程序,例如桌面应用程序,锁定整个应用程序直到请求完成的同步请求会导致不可接受的用户访问.


Mat*_*cey 6

同步操作将阻止您在等待请求完成或超时时执行任何其他操作.使用异步操作可以让您为用户制作动画,以显示程序正忙,甚至让他们继续使用其他功能区域.


Jar*_*Par 6

同步版本更容易编码,但它掩盖了一个非常严重的问题.网络通信或实际上是I/O操作可以阻止并延长一段时间.例如,许多网络连接的超时时间为2分钟.

同步执行网络操作意味着您的应用程序和UI将在整个操作期间阻止.一个并不罕见的网络打嗝可能导致您的应用程序阻止几分钟而无法取消.这导致非常不满意的客户.