我有一个奇怪的问题。

我正在创建网页的缩略图!我从未使用过线程,但遇到了问题

我正在使用以下代码

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处理,以便在发送响应之前等待其完成。

08-25 17:37