【问题标题】:Download button does not display下载按钮不显示
【发布时间】:2012-05-30 10:57:03
【问题描述】:

我有一个奇怪的问题..

我正在创建网页的缩略图!我从来没有使用过线程,我有一个问题

我正在使用以下代码

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 中放置,但它甚至在线程开始运行和创建缩略图之前就已创建。

有人可以帮我解决这个问题吗?

【问题讨论】:

  • 我尝试格式化代码,但 downloadbutton.visible=true; 行不适合您的示例中的任何位置 - 它超出了范围。请尝试更正示例代码。
  • 谢谢!!我试图让我的问题更笼统,所以有这个问题!

标签: c# asp.net multithreading dotnetzip downloadfile


【解决方案1】:

简短的回答是您不想为网页执行此操作。该网页的设计使得当点击处理程序完成时,它会继续页面生命周期,并且在 ASP 处理完它自己的一堆东西之后,它会将响应发送给客户端。在您的后台线程完成之前,该响应正在发送(或至少已完成,因此无法编辑)。

在 Web 环境中,如果您要分离另一个线程,则需要假设您将无法在另一个线程中为同一请求编辑任何内容。如果你做的足够快,或者如果你有一个非常慢的服务器,那么它可能工作,但通常它不会,你永远不能假设它会。

我的猜测是您根本不想创建另一个线程,并且您希望用户等到图像保存后再将控制权返回给用户。

如果接收请求对您来说真的很重要,做一些事情,向用户发送响应,然后在后台线程发生某些事情后更新页面再次,这是可能的,但是这是很多工作。 (而且还真的从你的服务器中吸走了资源。)Here 是 MSDN 上的一个例子,但我猜在这种情况下它是矫枉过正的,你最好不要打扰。

编辑:根据您的 cmets,代码需要位于另一个线程中,因为它当前不在 STA 线程中。因此,解决方案是Join click 事件处理程序中的那个线程,以便您在发送响应之前等待它完成。

【讨论】:

  • @AlexeiLevenkov 确实如此,但是如果您有一个异步处理程序,那么一旦该处理程序被分拆,您仍然无法编辑页面上的任何内容,或者您​​仍然会阻止用户,直到您完成更改(取决于您的设置方式)。使用内置的 ASP 异步的东西会更好地管理线程,但它并没有真正解决这个特定的问题。
  • @servy .. 你能告诉我如何知道所有图像都已创建并且可以使用下载按钮.. 我的意思是我应该在哪里使下载按钮可见..请帮帮我:(
  • @helpme 只是不要异步执行。不要创建任何后台线程,只需将所有代码放在按钮单击处理程序中,然后让用户等待,直到您完成所有操作以向他们显示任何内容。
  • @Servy,是的...我也错过了线程的 STA 要求,因此在这种情况下,即使使用线程管理部分,异步页面处理也不太可能有帮助。 Helpme - 你必须自己弄清楚你需要做什么 - 我们可以帮助你如何做/如何不做的事情,但我们无法帮助你做什么。请考虑绘制时间表(用笔和纸),了解何时有东西可用以及何时/何地可以启用您需要的任何东西。
  • @Servy,OP 可能必须为 STA 对象创建单独的线程......线程之间的一些同步以等待原始线程可能是一种选择。
【解决方案2】:

解决此问题的最简单方法是使用 webBrowseThread.join() 等到该过程完成,然后说 downloadbutton.visible= true !

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 1970-01-01
    • 2022-01-05
    • 2012-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-13
    • 2018-04-01
    相关资源
    最近更新 更多