我有一个奇怪的问题。
我正在创建网页的缩略图!我从未使用过线程,但遇到了问题
我正在使用以下代码
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中,但是即使在线程开始运行之前和缩略图创建之前,它也会被创建。
有人可以帮我解决此问题吗?
最佳答案
简短的答案是您不想在网页上执行此操作。该网页经过设计,以便在单击处理程序完成时,它可以随着页面生命周期继续前进,并且在ASP处理完一堆自己的东西后,它将响应发送给客户端。在您的后台线程完成之前,该响应已发送(或至少已完成,因此无法进行编辑)。
在Web环境中,如果您要分离另一个线程,则需要假定您将无法在另一个线程中针对同一请求编辑任何内容。如果您足够快地执行此操作,或者服务器速度非常慢,则它可能会起作用,但通常不会起作用,并且您永远无法假设它会起作用。
我的猜测是,您根本不想创建另一个线程,而是希望用户等到图像保存后再将控制权返回给用户。
如果对您来说接收请求确实很重要,则可以做一些事情,向用户发送响应,然后在后台线程中发生某些事情之后再次更新页面,这是可能的,但这是很多工作。 (并且确实从服务器中吸收了资源。)Here是在MSDN上执行此操作的一个示例,但是我猜想,在这种情况下,它是过大的,最好不要打扰。
编辑:根据您的注释,该代码需要位于另一个线程中,因为它当前不在STA线程中。因此,解决方案是在单击事件处理程序中对该线程进行Join
处理,以便在发送响应之前等待其完成。