我正在创建一个从C#.NET中的URL绘制图像的应用程序。问题是,当这个元素加载时,它会冻结应用程序并且不会绘制表单的其余部分。反正有没有阻止这个?
我想说的是有一种方法可以在执行此操作时继续运行程序的其余部分,就像其他语言中的协同例程一样。
WebRequest aReq = WebRequest.Create(avatarURL);
WebResponse aRes = aReq.GetResponse();
Image img = Image.FromStream(aRes.GetResponseStream());
e.Graphics.DrawImage(img, 10, 10, 55, 55);
我尝试使用线程,但我无法让它工作我的代码现在看起来像这样:
Thread drawavatar = new Thread(new ThreadStart(() => drawAvatarDetails(e)));
while (a_img != null)
{
e.Graphics.DrawImage(a_img, 10, 10, 55, 55);
}
并在drawAvatarDetaails中我将全局a_img分配给头像的图像
答案 0 :(得分:1)
仅使用BackGroundWorker
。并在DoWork
事件中执行此操作。当然,我建议将图像保存在全局变量中,然后在Form的Paint(或控制绘画)事件中绘制它。
BackgroundWorker bw;
Image img;
private void Form1_Load(object sender, EventArgs e)
{
bw = new BackgroundWorker();
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.RunWorkerAsync();
this.Paint += new PaintEventHandler(Form1_Paint);
}
void Form1_Paint(object sender, PaintEventArgs e)
{
if (img != null)
{
e.Graphics.DrawImage(img, 10, 10, 55, 55);
}
}
void bw_DoWork(object sender, DoWorkEventArgs e)
{
WebRequest aReq = WebRequest.Create(avatarURL);
WebResponse aRes = aReq.GetResponse();
img = Image.FromStream(aRes.GetResponseStream());
}
答案 1 :(得分:0)
如果您访问主UI线程以外的用户控件,则会出现cross thread operation not valid
异常。因此,如果您使用.Net 4.5,我建议您使用async/await
async void Draw(string avatarURL)
{
HttpClient client = new HttpClient();
Image img = Image.FromStream(await client.GetStreamAsync(avatarURL));
// Your drawing code
// for ex, this.BackgroundImage = img;
}