C#加载图像异步

时间:2016-05-03 16:04:12

标签: c# winforms asynchronous httpwebrequest httpwebresponse

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

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

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和其他网站上阅读了很多帖子,但我仍然不理解异步。我真的希望这里的某个人可以尝试解释如果使用async是正确的方法。

抱歉我的英文不好,我希望不要难以理解。

1 个答案:

答案 0 :(得分:1)

一般情况下,使用.NET内置对象(希望按惯例使用任何对象),只需使用Async对应方法即可使用“async”版本。

例如,而不是:

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

你会有这个:

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

请注意在方法调用found here上添加Async,以及添加await关键字。后一种变化也需要改变方法签名:

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

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

Image someImage = await GetImageFromURL(someUrl);

异步操作应该一直持续到顶层。 (说这个的常见方式是它应该“一直异步”。)

方法为async后,您可以根据需要在其中进行尽可能多的await操作。您当前正在调用的其他一些方法也可能具有Async个等效项,因此您可以对它们执行相同的操作。