【发布时间】:2014-02-24 00:19:06
【问题描述】:
我正在尝试将图像从网络服务器加载到图片框。为了在加载图片之前不阻塞表单,我启动了一个新线程,该线程在 LoadPicture() 函数上工作,直到所有工作完成。
一切都将在 MouseHover-Event 上启动,因此它可以在短时间内多次触发,因为默认的 WindowsHoverTime 是 180 毫秒并且无法更改(我对此进行了很多搜索)。 这是函数:
public void LoadPicture(string url)
{
try
{
WebRequest req = HttpWebRequest.Create(url);
req.Timeout = 3500;
req.Method = "HEAD";
using (WebResponse resp = req.GetResponse())
{
int ContentLength;
if (int.TryParse(resp.Headers.Get("Content-Length"), out ContentLength))
{
string ContentType = resp.Headers.Get("Content-Type");
if (ContentLength < 1048576 && ContentType == "image/png")
{
this.pictureBox1.Load(url);
}
else
{
this.pictureBox1.Image = mainprogram.Properties.Resources.sample;
}
}
}
}
catch { this.pictureBox1.Image = mainprogram.Properties.Resources.sample; }
}
如果 url 包含小于 1MB 的 png 文件,则应将其加载到 pictureBox1,如果没有,则从资源中加载默认图像。
线程和调用:
namespace mainprogram
{
public partial class Form1 : Form
{
Thread threadworker;
.
.
.
private void button1_MouseHover(object sender, EventArgs e)
{
if (threadworker.IsAlive == false)
{
threadworker = new Thread(() => LoadPicture(url));
threadworker.Start();
}
}
现在的问题是:线程几乎总是会失败。 Catch{} 将执行 9/10 次。主要在 WebResponse resp = req.GetResponse() 崩溃。如果我在同一个线程中使用该函数(不启动一个新线程),它会正常加载,但 GUI 将停止响应 3 秒,直到图片加载完毕。
编辑:有时它确实有效,所以我不确定我做错了什么。
【问题讨论】:
-
你得到了什么异常?
-
你应该使用异步
HttpClient而不是线程。 -
什么都没有,因为我使用 try&catch,它只会失败并触发 catch{} 短语
-
@SLaks 你能举个简单的例子吗?
标签: c# multithreading visual-studio-2013 webrequest system.net