gpt4 book ai didi

c# - WebClient DownloadData 方法卡住 Form

转载 作者:行者123 更新时间:2023-12-03 13:04:40 25 4
gpt4 key购买 nike

我正在使用来自 WebClient 对象的 DownloadData 从几个网站下载网站图标。

我收到了字节数组的响应,一切正常,除了一件事:当 DownloadData 方法被执行时,它会卡住我的表单,直到方法返回 .

现在,我已经通过使用 BackgroundWorker 对象 解决了这个问题完成工作,但我很好奇如何使用 实现相同的目标System.Threading.Thread .

我尝试创建另一个下载网站图标的线程,然后循环我的 mainThread 直到线程完成处理,然后使用 Abort() 方法中止线程,但到目前为止,我的表单在另一个线程的执行过程中被卡住。

这是我用来创建另一个线程的代码:

    bool downloadFavIcon_Completed = false;
private void downloadFavIcon()
{
downloadFavIcon_Completed = false;
Byte[] dl;
System.IO.MemoryStream dlMem;
Bitmap favCollection = new Bitmap(96, 64);
Graphics g = Graphics.FromImage(favCollection);
Bitmap dlImg;
String[] addr = new String[24];
addr[0] = @"http://google.com/favicon.ico";
addr[1] = @"http://microsoft.com/favicon.ico";
addr[2] = @"http://freesfx.com/favicon.ico";
addr[3] = @"http://yahoo.com/favicon.ico";
addr[4] = @"http://downloadha.com/favicon.ico";
addr[5] = @"http://hp.com/favicon.ico";
addr[6] = @"http://bing.com/favicon.ico";
addr[7] = @"http://webassign.com/favicon.ico";
addr[8] = @"http://youtube.com/favicon.ico";
addr[9] = @"https://twitter.com/favicon.ico";
addr[10] = @"http://cc.com/favicon.ico";
addr[11] = @"http://stackoverflow.com/favicon.ico";
addr[12] = @"http://vb6.us/favicon.ico";
addr[13] = @"http://facebook.com/favicon.ico";
addr[14] = @"http://flickr.com/favicon.ico";
addr[15] = @"http://linkedin.com/favicon.ico";
addr[16] = @"http://blogger.com/favicon.ico";
addr[17] = @"http://blogfa.com/favicon.ico";
addr[18] = @"http://metal-archives.com/favicon.ico";
addr[19] = @"http://wordpress.com/favicon.ico";
addr[20] = @"http://metallica.com/favicon.ico";
addr[21] = @"http://wikipedia.org/favicon.ico";
addr[22] = @"http://visualstudio.com/favicon.ico";
addr[23] = @"http://evernote.com/favicon.ico";
for (int i = 0; i < addr.Length; i++)
{
using (System.Net.WebClient client = new System.Net.WebClient())
{
try
{
dl = client.DownloadData(addr[i]);
dlMem = new System.IO.MemoryStream(dl);
dlImg = new Bitmap(dlMem);
}
catch (Exception)
{
dlImg = new Bitmap(Properties.Resources.defaultFavIcon);
}
}
g.DrawImage(dlImg, (i % 6) * 16, (i / 6) * 16, 16, 16);
}
passAddDisplay.Image = favCollection;
downloadFavIcon_Completed = true;
}

private void button2_Click(object sender, EventArgs e)
{
Thread downloader = new Thread(new ThreadStart(downloadFavIcon));
downloader.Start();
while (!downloader.IsAlive) ;
while (!downloadFavIcon_Completed) ;
downloader.Abort();
}

注意: 通过添加显示 是一个已经放在我的表单上的图片框。

如何改进我的应用程序以避免在执行 WebClient.DownloadData 期间被卡住? (我不想使用 Application.DoEvents())

最佳答案

是的,它是一种同步方法,它导致线程等待而不处理消息,直到它返回;你应该试试它的异步版本,它没有。

关于c# - WebClient DownloadData 方法卡住 Form,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29504187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com