2013-04-20 102 views
0

我正在制作一个从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

它是如何加载的?优化看不见的代码非常困难:) – Ryan 2013-04-20 18:24:33

+0

你能分享一些代码吗? – aliassce 2013-04-20 18:24:37

+0

添加了我用来获取图像的方法 – user2117190 2013-04-20 18:25:49

回答

1

使用简单的BackGroundWorker。并在DoWork事件中执行此操作。当然,我建议将图像保存在一个全局变量中,并在Form's 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()); 
    } 
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; 

}