C# 异步加载图片

C# Loading images async

我正在创建的程序有一些图片框。 这些图像不会添加到资源中,而是我想从网站加载它们。 到目前为止它工作正常,最大的问题是如果无法加载图像,程序会崩溃。 我搜索了这个问题,似乎让图像异步是解决这个问题的正确方法。

目前这是我加载图片的方式:

private static Image GetImageFromURL(string url)
{
    HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
    HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();
    Stream stream = httpWebReponse.GetResponseStream();
    return Image.FromStream(stream);
}

.....

foo.Image = GetImageFromURL("https://foo.com/bar.jpg");

我已经阅读了 SO 和其他网站上的许多主题,但我仍然不了解异步。如果异步是正确的方式,我真的希望这里有人可以尝试解释如何使用它。

抱歉我的英语不好,我希望它不难理解。

一般来说,对于 .NET 内置对象(并且希望按照任何对象的约定),"async" 版本只需使用 Async 相应的方法即可使用。

例如,而不是这个:

HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse();

你会得到这个:

HttpWebResponse httpWebReponse = (HttpWebResponse)(await httpWebRequest.GetResponseAsync());

注意在方法调用中添加 Asyncfound here,以及添加 await 关键字。后一个更改也需要更改方法签名:

private static async Task<Image> GetImageFromURL(string url)

任何调用它的方法也必须改变:

Image someImage = await GetImageFromURL(someUrl);

异步操作应该一直继续到顶层。 (一般的说法是应该是"async all the way down"。)

一旦方法为 async,您可以在其中进行任意数量的 await 操作。您当前正在调用的其他一些方法可能也有 Async 等价物,因此您可以对它们执行相同的操作。