我正在尝试理解何时以及如何使用async
编程,并涉及到I/O绑定操作,但我不理解它们。我希望能够从头实现它们。怎么做呢?
请考虑以下同步示例:
private void DownloadBigImage() {
var url = "https://cosmos-magazine.imgix.net/file/spina/photo/14402/180322-Steve-Full.jpg";
new WebClient().DownloadFile(url, "image.jpg");
}
我如何在不使用Task.Run
的情况下实现async
版本,仅拥有正常同步方法DownloadBigImage
?因为那样会从线程池中使用一个线程进行等待,这只是在浪费资源!同时,请不要使用已经存在的async
方法! 这就是这个问题的目的:我如何自己制作它,而不依赖已经是async
的方法?所以,像NO这样的东西:await new WebClient().DownloadFileTaskAsync(url, "image.jpg");
内容翻译如下:在这方面,可用的示例和文档非常缺乏。我只找到了这个网址: https://learn.microsoft.com/en-us/dotnet/standard/async-in-depth 其中说:
调用 GetStringAsync() 将通过较低级别的 .NET 库(可能调用其他异步方法)调用,直到它进入本机网络库的 P/Invoke 交互调用。本机库随后可能会调用系统 API 调用(例如写入 Linux 上的套接字的 write())。可能会在本机/托管边界处创建一个任务对象,可能使用 TaskCompletionSource。该任务对象将通过层传递,可能经过操作或直接返回,最终返回给初始调用者。
基本上我必须使用“P/Invoke interop call into a native networking library”... 但是如何做呢?