【问题标题】:Asynchronously Load an Image from a Url to a PictureBox将图像从 Url 异步加载到 PictureBox
【发布时间】:2016-06-11 12:48:57
【问题描述】:

我想在 Windows 窗体应用程序上从网络加载图像, 一切都很好,代码工作正常,但问题是应用程序停止工作,直到加载完成。 我想查看和使用应用程序无需等待加载

PictureBox img = new System.Windows.Forms.PictureBox();
var request = WebRequest.Create(ThumbnailUrl);

using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
    img.Image = Bitmap.FromStream(stream);
}

【问题讨论】:

  • 是时候研究BackgroundWorkerasnyc了。
  • 谢谢,我现在搜索
  • 在后台工作人员dowork 事件中进行操作
  • @Rahul,谢谢,我去搜索一下backgroundworker dowork
  • PictireBox 控件本身支持异步加载图像,您不需要使用后台工作程序或异步/等待。它还从 url 加载图像,因此您不需要使用 Web 请求。您可以简单地使用LoadAsync 方法或PictureBoxImageLocation 属性。 WaitOnLoad 属性的值应为默认值 false。请参阅下面的答案。

标签: c# .net winforms picturebox webrequest


【解决方案1】:

解决办法如下:

public async Task<Image> GetImageAsync(string url)
{
    var tcs = new TaskCompletionSource<Image>();
    Image webImage = null;
    HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
    request.Method = "GET";
    await Task.Factory.FromAsync<WebResponse>(request.BeginGetResponse, request.EndGetResponse, null)
        .ContinueWith(task =>
        {
            var webResponse = (HttpWebResponse) task.Result;
            Stream responseStream = webResponse.GetResponseStream();
            if (webResponse.ContentEncoding.ToLower().Contains("gzip"))
                responseStream = new GZipStream(responseStream, CompressionMode.Decompress);
            else if (webResponse.ContentEncoding.ToLower().Contains("deflate"))
                responseStream = new DeflateStream(responseStream, CompressionMode.Decompress);

            if (responseStream != null) webImage = Image.FromStream(responseStream);
            tcs.TrySetResult(webImage);
            webResponse.Close();
            responseStream.Close();
        });
    return tcs.Task.Result;
}

这里是如何调用上述解决方案:

PictureBox img = new System.Windows.Forms.PictureBox();
var result = GetImageAsync(ThumbnailUrl);
result.ContinueWith(task =>
{
    img.Image = task.Result;
});

【讨论】:

  • 您是否缺少类似 ')' 之类的内容,因为代码不起作用
  • 谢谢你,太棒了,dameeeet garm yaser jan
  • PictireBox 控件本身支持异步加载图像,您不需要使用后台工作程序或异步/等待。您可以简单地使用PictureBoxLoadAsync 方法。
  • @RezaAghaei 有时您必须从需要添加标题和一些 cookie 的站点接收图片。因此,您将被允许获取照片。
  • @YasserBazrforoosh 为什么在 async/awai 已经可用时使用 TCS 和 ContinueWithvar response= Task.Factory.FromAsync&lt;WebResponse&gt;(..) 将返回响应并返回 UI 线程。 ConfigureAwait(false) 可以用来避免这种情况,例如允许在线程池线程中加载图像。不需要任何ContinueWith() 调用。
【解决方案2】:

PictureBox 控件内置了对异步加载图像的支持。您不需要使用 BackgroundWorker 或 async/await。它还可以从 URL 加载图像,因此您无需使用 Web 请求。

您可以简单地使用LoadAsync 方法或PictureBoxImageLocation 属性。 WaitOnLoad 属性的值应该是false,这是默认值。

pictureBox1.LoadAsync("https://i.stack.imgur.com/K4tAc.jpg");

相当于:

pictureBox1.ImageLocation = "https://i.stack.imgur.com/K4tAc.jpg";

【讨论】:

    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 2012-04-04
    • 2022-11-16
    相关资源
    最近更新 更多