我正试着了解异步编程的一般情况。在C#中,现在似乎每个人都在使用异步等待同步糖,用于IO绑定的异步操作。
我的问题是:到目前为止,任何像文件读取、http请求等被IO绑定的操作都可以通过写入异步的包装函数而成为asnync吗?
还是因为底层的“旧”实现(如果是同步的)根本没有帮助?曾经等待到现在的线程会不会被释放?
有没有人?
发布于 2019-05-27 06:59:18
用sync方法包装async方法可能有一些好处。底层方法仍然是同步的,但是您可以将该方法卸载到另一个线程,因此用于等待的线程现在可以继续执行它。因此,在您的示例中,如果UI线程调用阻塞方法GetHTTPResource,则可以通过使用异步包装器将该方法卸载到另一个线程来实现UI响应。我向您推荐这个博客帖子,我认为它可以让您更好地理解async对sync的含义。( 另一个覆盖sync而不是async)。
使用async通过sync,仍然会有一个线程被阻塞。这就是为什么在web应用程序的情况下,使用异步包装器进行同步功能没有任何性能好处的原因。引用上述条款(强调“地雷”):
异步调用同步方法的能力对可伸缩性没有任何作用,因为如果同步调用同步方法(实际上,您正在使用更多的资源,因为调度某些东西会导致开销),那么通常仍在消耗相同数量的资源--,您只是使用不同的资源来执行,例如,来自线程池的线程而不是正在执行的特定线程。异步实现所宣扬的可伸缩性好处是通过减少您使用的资源量来实现的,这需要在异步方法…的实现中考虑。这不是通过包围它来实现的。
对于实例化,对于ASP.NET应用,完全async代码允许线程在其他请求等待I/O操作完成时处理新请求,从而实现更高的可伸缩性。另一方面,如果代码有用于I/O操作的底层同步方法,则会有阻塞的线程,它们只能等待这些操作完成。因此,在web应用程序的情况下,async over sync通常没有好处。
发布于 2019-05-27 05:37:33
是的,同步函数可以变成异步函数,例如,在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);
}调用函数到
var result = HttpClient.GetRequest(requestUri, _request, _requestHeaders).Result;希望这对你有帮助..。
https://stackoverflow.com/questions/56320085
复制相似问题