2

私は奇妙な問題を抱えています..

Webページのサムネイルの作成に取り組んでいます!スレッドを使用したことがなく、問題があります

次のコードを使用しています

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 に配置しようとしましたが、スレッドが実行を開始する前、およびサムネイルが作成される前でも作成されます。

誰かがこの問題を解決するのを手伝ってくれますか?

4

2 に答える 2

1

簡単な答えは、Web ページに対してこれを行いたくないということです。Web ページは、クリック ハンドラーが終了するとページのライフサイクルに進み、ASP が独自のものを処理した後、クライアントに応答を送信するように設計されています。バックグラウンド スレッドが終了する前に、その応答が送信されます (または、少なくとも編集できないように最終化されます)。

Web 環境で別のスレッドをスピンオフしている場合、別のスレッドでは同じ要求に対して何も編集できないと想定する必要があります。すぐに実行した場合、または非常に遅いサーバーを使用している場合は機能する可能性がありますが、通常は機能せず、機能するとは想定できません.

私の推測では、別のスレッドを作成したくないだけで、ユーザーに制御を戻す前に、画像が保存されるまで待機させたいと考えています。

リクエストを受け取り、何らかの処理を行い、ユーザーにレスポンスを送信し、バックグラウンド スレッドで何かが発生した後にページを再度更新することが本当に重要な場合、それは可能ですが、それは大変な作業です。(また、実際にサーバーからリソースを吸い上げます。) これを行う MSDN のを次に示しますが、この場合はやり過ぎであり、気にしない方がよいと思います。

編集:コメントに基づいて、コードは現在STAスレッドにないため、別のスレッドにある必要があります。したがって、解決策はJoin、クリックイベントハンドラーのそのスレッドに対して、応答を送信する前に終了するのを待つことです。

于 2012-05-23T21:02:46.620 に答える
0

この問題を解決する最も簡単な方法は、 webBrowseThread.join() を使用してプロセスが完了するまで待ってから、 downloadbutton.visible= true と言う方法です。

于 2012-05-24T16:03:46.843 に答える