我有一个奇怪的问题..
我正在制作网页缩略图!我从来没有使用线程,我有一个问题
我正在使用以下代码
protected void GetScreenshot_Click(object sender, EventArgs e)
{
path = Server.MapPath(FolderID);
Thread webBrowseThread = new Thread(new ThreadStart(PerformWebBrowseOp));
webBrowseThread.SetApartmentState(ApartmentState.STA);
webBrowseThread.Start();
}
protected void PerformWebBrowseOp()
{
if(searchedword!='')
{
Directory.CreateDirectory(path);
}
string path1 = Mypath + "/image.png";
GeneateScreenshot gn = new GeneateScreenshot();
Bitmap thumbnail = gn.GenerateScreenshot("http://www.google.com/search?hl=en&q=" + Searchedword, 1024, 768);
FileStream imageStream = new FileStream(path1, FileMode.Create);
thumbnail.Save(imageStream, System.Drawing.Imaging.ImageFormat.Png);
imageStream.Close();
downloadbutton.Visible=true;
}
现在我的问题是我在创建缩略图时会显示一个下载按钮..但由于某种原因,下载按钮没有生成或不可见!
我尝试放入getscreenshot_click,但它甚至在线程开始运行之前和创建缩略图之前就已创建。
有人可以帮我解决这个问题吗?
答案 0 :(得分:1)
简短的回答是,您不希望为网页执行此操作。网页的设计使得当点击处理程序完成后,它继续页面生命周期,并且在ASP处理了它自己的一堆东西后,它会将响应发送给客户端。在您的后台线程完成之前,该响应正在发送(或至少已完成,因此无法对其进行编辑)。
在网络环境中,如果您正在关闭另一个线程,则需要假设您无法在另一个线程中编辑同一请求的任何内容。如果你很快就做到了,或者你的服务器速度很慢,那么可能可以工作,但通常它不会,但你不能认为它会。
我的猜测是你根本不想创建另一个线程,并且你希望用户等到图像保存后再将控制权交还给用户。
如果您收到请求非常重要,请执行一些操作,向用户发送回复,然后在后台线程中发生某些事情后再次更新页面是可能的,但它有很多工作要做。 (而且你的服务器资源也非常糟糕。)Here是MSDN上的一个例子,但是我的猜测是,在这种情况下它有点矫枉过正,你最好不要困扰。
编辑:根据您的评论,代码需要位于另一个线程中,因为它当前不在STA线程中。因此,解决方案是在您的点击事件处理程序中Join
线程,以便您在发送响应之前等待它完成。
答案 1 :(得分:0)
解决此问题的最简单方法是使用webBrowseThread.join()等待进程完成,然后说downloadbutton.visible = true!