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 分配给化身的图像

4

2 回答 2

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());
    }
于 2013-04-20T18:29:17.920 回答
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;

}
于 2013-04-20T18:56:28.930 回答