GetResponseAsync png link url - 参数无效
GetResponseAsync png link url - Parameter not valid
我必须编写一个 Windows 从 url 打印 png 的表单应用程序,我想异步编写代码。
这是我的工作代码(同步)
public Bitmap GetImage()
{
Bitmap bmp;
var request = WebRequest.Create("http://www.basilicasanmarco.it/wp-content/themes/tema-basilicasmarco/library/images/patriarcato.png");
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
bmp = new Bitmap(stream);
}
return bmp;
}
private void PrintImage(PaintEventArgs e)
{
using (var imag = GetImage())
{
if (imag == null)
return;
var newHeight = mainImage.Height;
var rapporto = newHeight / (double) imag.Height;
var newWidth = Convert.ToInt32(rapporto * imag.Width);
var imageLocationX = Convert.ToInt32((mainImage.Width - newWidth) / 2.0);
e.Graphics.DrawImage(imag, imageLocationX, 0, newWidth, newHeight);
}
}
现在我想以异步等待的方式编写相同的代码,这是我的代码片段:
public async Task<Bitmap> GetImage()
{
Bitmap bmp;
var request = WebRequest.Create("http://www.basilicasanmarco.it/wp-content/themes/tema-basilicasmarco/library/images/patriarcato.png");
using (var response = await request.GetResponseAsync())
using (var stream = response.GetResponseStream())
{
bmp = new Bitmap(stream);
}
return bmp;
}
private async Task PrintImageAsync(PaintEventArgs e)
{
using (var imag = await GetImage())
{
var newHeight = mainImage.Height;
var rapporto = newHeight / (double) imag.Height;
var newWidth = Convert.ToInt32(rapporto * imag.Width);
var imageLocationX = Convert.ToInt32((mainImage.Width - newWidth) / 2.0);
e.Graphics.DrawImage(imag, imageLocationX, 0, newWidth, newHeight);
}
}
第一个同步代码运行良好,当我转向异步部分时,我在
中有 "Parameter not valid" 异常(System.Drawing 异常)
e.Graphics.DrawImage(imag, imageLocationX, 0, newWidth, newHeight);
代码。
得到的Bitmap貌似没问题,Width和Height是对的,但是里面有问题,只是异步方式有问题
我做错了什么?
更新:
我通过以下方式等待 Panel
的 Paint
方法中的方法:
this.panel.Paint += new System.Windows.Forms.PaintEventHandler(this.mainImage_Paint);
private async void mainImage_Paint(object sender, PaintEventArgs e)
{
await PrintImageAsync(e);
}
我想要获得的是在 Panel 而不是 PictureBox 中绘制下载的图像,因为我需要更底层的方法。
每次重新绘制控件都会调用 Paint 事件处理程序,您可能不希望每次发生这种情况时都下载图像。
调用事件处理程序时,似乎访问事件 args (e) 参数中的图形对象在异步操作之前成功,但在等待之后失败。
因此;
不清楚是什么触发了源代码中的图像下载,但如果尝试异步进行,则异步获取图像并将其保存在一个字段中,如果可用则将其绘制在面板上.
下面假设你直接下载图片,没有任何用户操作,这个地方是async void Form_Load():(可以看到图片是后台下载的! )
private async void Form1_Load(object sender, EventArgs e)
{
this.panel1.Paint += this.mainImage_Paint;
downloadedBitmap = await GetImage();
// When we got the image, invalidate the panel to trigger a re-paint
this.panel1.Invalidate();
}
// Keep the downloaded image in a field:
private Image downloadedBitmap;
private async void mainImage_Paint(object sender, PaintEventArgs e)
{
if (downloadedBitmap != null)
{
var newHeight = mainImage.Height;
var rapporto = newHeight / (double)downloadedBitmap.Height;
var newWidth = Convert.ToInt32(rapporto * downloadedBitmap.Width);
var imageLocationX = Convert.ToInt32((mainImage.Width - newWidth) / 2.0);
e.Graphics.DrawImage(downloadedBitmap, imageLocationX, 0, newWidth, newHeight);
}
}
我必须编写一个 Windows 从 url 打印 png 的表单应用程序,我想异步编写代码。 这是我的工作代码(同步)
public Bitmap GetImage()
{
Bitmap bmp;
var request = WebRequest.Create("http://www.basilicasanmarco.it/wp-content/themes/tema-basilicasmarco/library/images/patriarcato.png");
using (var response = request.GetResponse())
using (var stream = response.GetResponseStream())
{
bmp = new Bitmap(stream);
}
return bmp;
}
private void PrintImage(PaintEventArgs e)
{
using (var imag = GetImage())
{
if (imag == null)
return;
var newHeight = mainImage.Height;
var rapporto = newHeight / (double) imag.Height;
var newWidth = Convert.ToInt32(rapporto * imag.Width);
var imageLocationX = Convert.ToInt32((mainImage.Width - newWidth) / 2.0);
e.Graphics.DrawImage(imag, imageLocationX, 0, newWidth, newHeight);
}
}
现在我想以异步等待的方式编写相同的代码,这是我的代码片段:
public async Task<Bitmap> GetImage()
{
Bitmap bmp;
var request = WebRequest.Create("http://www.basilicasanmarco.it/wp-content/themes/tema-basilicasmarco/library/images/patriarcato.png");
using (var response = await request.GetResponseAsync())
using (var stream = response.GetResponseStream())
{
bmp = new Bitmap(stream);
}
return bmp;
}
private async Task PrintImageAsync(PaintEventArgs e)
{
using (var imag = await GetImage())
{
var newHeight = mainImage.Height;
var rapporto = newHeight / (double) imag.Height;
var newWidth = Convert.ToInt32(rapporto * imag.Width);
var imageLocationX = Convert.ToInt32((mainImage.Width - newWidth) / 2.0);
e.Graphics.DrawImage(imag, imageLocationX, 0, newWidth, newHeight);
}
}
第一个同步代码运行良好,当我转向异步部分时,我在
中有 "Parameter not valid" 异常(System.Drawing 异常)e.Graphics.DrawImage(imag, imageLocationX, 0, newWidth, newHeight);
代码。 得到的Bitmap貌似没问题,Width和Height是对的,但是里面有问题,只是异步方式有问题
我做错了什么?
更新:
我通过以下方式等待 Panel
的 Paint
方法中的方法:
this.panel.Paint += new System.Windows.Forms.PaintEventHandler(this.mainImage_Paint);
private async void mainImage_Paint(object sender, PaintEventArgs e)
{
await PrintImageAsync(e);
}
我想要获得的是在 Panel 而不是 PictureBox 中绘制下载的图像,因为我需要更底层的方法。
每次重新绘制控件都会调用 Paint 事件处理程序,您可能不希望每次发生这种情况时都下载图像。
调用事件处理程序时,似乎访问事件 args (e) 参数中的图形对象在异步操作之前成功,但在等待之后失败。
因此;
不清楚是什么触发了源代码中的图像下载,但如果尝试异步进行,则异步获取图像并将其保存在一个字段中,如果可用则将其绘制在面板上.
下面假设你直接下载图片,没有任何用户操作,这个地方是async void Form_Load():(可以看到图片是后台下载的! )
private async void Form1_Load(object sender, EventArgs e)
{
this.panel1.Paint += this.mainImage_Paint;
downloadedBitmap = await GetImage();
// When we got the image, invalidate the panel to trigger a re-paint
this.panel1.Invalidate();
}
// Keep the downloaded image in a field:
private Image downloadedBitmap;
private async void mainImage_Paint(object sender, PaintEventArgs e)
{
if (downloadedBitmap != null)
{
var newHeight = mainImage.Height;
var rapporto = newHeight / (double)downloadedBitmap.Height;
var newWidth = Convert.ToInt32(rapporto * downloadedBitmap.Width);
var imageLocationX = Convert.ToInt32((mainImage.Width - newWidth) / 2.0);
e.Graphics.DrawImage(downloadedBitmap, imageLocationX, 0, newWidth, newHeight);
}
}