C# 异步等待和一般异步问题

C# 异步等待和一般异步问题,c#,asynchronous,C#,Asynchronous,我试图了解一些关于异步编程的一般知识。 在C#中,似乎每个人现在都在使用async Wait Syntactic sugar进行IO绑定的异步操作 我的问题是:任何IO绑定的操作,比如文件读取、http请求等,直到现在都是同步的,是否可以通过写一个异步的包装函数而成为asnync 或者因为底层的“旧”实现(如果它是同步的)根本没有帮助? 以前一直等待到现在的线程是否会被释放 有人吗?是的,您的同步功能可以变为异步,例如,在HTTP请求中,您可以更改同步功能 public static Task&

我试图了解一些关于异步编程的一般知识。 在C#中,似乎每个人现在都在使用async Wait Syntactic sugar进行IO绑定的异步操作

我的问题是:任何IO绑定的操作,比如文件读取、http请求等,直到现在都是同步的,是否可以通过写一个异步的包装函数而成为asnync

或者因为底层的“旧”实现(如果它是同步的)根本没有帮助? 以前一直等待到现在的线程是否会被释放


有人吗?

是的,您的同步功能可以变为异步,例如,在HTTP请求中,您可以更改同步功能

public static Task<HttpResponseMessage> GetRequest(string requestUri, Dictionary<string, string> requestHeaders)
    {
        return HttpRequestFactory.Get(requestUri, requestHeaders);
    }
var result =  HttpClient.GetRequest(requestUri, _request, _requestHeaders)
您将像这样将其更改为异步

public static async Task<HttpResponseMessage> GetRequest(string requestUri, Dictionary<string, string> requestHeaders)
   {
            return await HttpRequestFactory.Get(requestUri, requestHeaders);
   }

希望这对您有所帮助。

sync
方法与
async
方法包装在一起可能会有一些好处。底层方法仍将是同步的,但您可以将该方法卸载到另一个线程,因此用于等待的线程现在可以继续执行。因此,在您的示例中,如果UI线程调用阻塞方法
GetHTTPResource
,您可以通过使用异步包装器将该方法卸载到另一个线程来实现UI响应。我向您推荐这一点,我认为这可以让您更好地理解
async
而不是
sync
意味着什么。(包括
sync
over
async

async
超过
sync
时,仍会有一个线程被阻塞。这就是为什么在web应用程序中使用异步包装器来实现同步功能没有任何性能优势的原因。引用上述文章(重点):

异步调用同步方法的能力不起任何作用 对于可伸缩性,因为您通常仍在使用相同的 如果同步调用,您将拥有的资源量 (事实上,您使用了更多,因为这会产生额外的开销。) 安排一些事情),你只是在使用不同的资源来做 它,例如,来自线程池的线程,而不是特定线程 你在执行死刑。被吹捧的可伸缩性优势 异步实现是通过减少 您所使用的资源,并且需要将其烘焙到实现中 对于异步方法,它不是通过包装实现的 围绕着它


例如,对于实例,完全
async
代码允许线程在其他请求等待I/O操作完成时处理新请求,从而实现更高的可伸缩性。另一方面,如果代码中有用于I/O操作的底层同步方法,那么会有线程被阻塞,这些线程只能等待这些操作完成,而不能执行任何操作。因此
async
over
sync
在web应用程序中通常没有任何好处。

这里似乎有很多概括,你能举个例子吗。假设我有一个名为:GetHTTPResource的方法,它获取一个hrl作为参数,并在读取此url web内容后返回一个字符串。此方法已同步。现在,我编写一个包装器方法如下所示:public async static gethttpresourceync,它内部只调用wait gethttpresource,这是我理解的技术部分,但仍然是。底层方法是sync。Get.doesn这是否意味着线程仍将挂起?您可以在
var result=HttpClient.GetRequest(requestUri,\u request,\u requestHeaders)
的末尾删除result:“异步方法不应纯粹为了卸载而公开。唯一应该公开的异步方法是那些比同步方法具有可伸缩性优势的方法。“谢谢。但是还有一个问题-您提到UI线程将被释放。但我还是不明白。有一个线程仍然被阻塞,对吗?这是否意味着在一个不是UI/UX的服务器API中它没有任何好处?@TheodorZoulias True,尽管这个结论特别涉及到开发库和它们应该提供的API表面。我的意思是,这是OP所寻求的
async
sync
理解的总结@PiniBest我编辑了我的答案以解决您评论中的问题。@PiniBest我没有提到任何有关web应用程序示例的内容。我刚刚强调了一篇链接文章的核心点。同步上的异步是一种反模式。对于服务器应用程序,async over sync实际上降低了吞吐量和可伸缩性。
var result = HttpClient.GetRequest(requestUri, _request, _requestHeaders).Result;