2012-05-23 10 views
2

이상한 문제가 있습니다.다운로드 버튼이 표시되지 않습니다.

웹 페이지의 미리보기 이미지를 만드는 중입니다. 나는 스레딩과 함께 일한 적이 있고 난 다음 코드를 사용하고

문제가

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; 
} 

지금 내 문제는 내가 썸네일이 생성 된 경우 다운로드 버튼이 표시되어야 할 것입니다 ..하지만에 대한 어떤 이유로 donwload 버튼이 생성되지 않거나 보이지 않습니다!

getscreenshot_click에 배치하려했지만 스레드가 실행되기 전에 그리고 미리보기 이미지가 만들어지기 전에 만들어졌습니다.

누군가이 문제를 해결할 수 있도록 도와 줄 수 있습니까?

+0

코드를 포맷하려고 시도했지만'downloadbutton.visible = true;'행은 예제의 어느 부분에도 맞지 않습니다. 범위를 벗어납니다. 샘플 코드를 수정하십시오. – LarsTech

+0

완료 감사합니다 !! 나는 내 질문을 좀 더 일반화 시키려고 노력 했으므로이 문제가 있었다 !! – helpme

답변

0

이 문제를 해결하는 가장 간단한 방법은 webBrowseThread.join()을 사용하여 프로세스가 끝날 때까지 기다린 다음 downloadbutton.visible = true라고 말합니다.

1

간단히 대답하면 웹 페이지에서이 작업을 원하지 않는다는 것입니다. 웹 페이지는 클릭 핸들러가 끝나면 페이지 라이프 사이클과 함께 이동하고 ASP가 자신의 물건을 처리 한 후에 클라이언트에게 응답을 보내도록 설계되었습니다. 이 응답은 백그라운드 스레드가 완료되기 전에 보내지거나 최소한 편집 할 수 있도록 마무리됩니다.

웹 환경에서 다른 스레드를 돌리고 있다면 다른 스레드에서 동일한 요청에 대해 아무것도 편집 할 수 없다고 가정해야합니다. 조만간 그렇게하거나 서버가 실제로 느린 경우 일 수도 있고 일 수도 있지만 대개는 그렇지 않을 것이며 그럴 것이라고 가정 할 수는 없습니다.

다른 스레드를 만들고 싶지 않고 사용자가 컨트롤을 다시 반환하기 전에 이미지가 저장 될 때까지 기다리 길 원합니다.

당신이 정말로 요청을받는 것이 중요하다면, 사용자에게 응답을 보내고, 을 다시 백그라운드 스레드에서 일어난 후에 다시 업데이트하십시오. 작업. (또한 서버 리소스를 실제로 빨아들입니다.) Here은 MSDN에있는 예제이지만,이 경우 잔인 함으로 인해 걱정하지 않는 것이 좋습니다.

편집 : 귀하의 의견을 기반으로 코드는 현재 STA 스레드에없는 다른 스레드에 있어야합니다. 따라서 응답은 클릭 이벤트 처리기의 해당 스레드 Join에 있으므로 응답을 보내기 전에 완료 될 때까지 기다릴 수 있습니다.

+0

+1. ASP.Net은 비동기 페이지 처리를 지원합니다. –

+1

@AlexeiLevenkov 맞습니다. 그렇지만 비동기 처리기를 사용하면 핸들러가 분리되고 나면 변경 사항을 완료 할 때까지 여전히 사용자를 차단하고있는 상태에서 페이지에서 아무 것도 편집 할 수 없습니다 (방법에 따라 당신이 그것을 설정했습니다). 내장 된 ASP 비동기식 도구를 사용하면 스레드를 더 잘 관리 할 수 ​​있지만 실제로이 특정 문제를 해결하지는 못합니다. – Servy

+0

@servy .. 어떻게하면 모든 이미지가 만들어지고 다운로드 버튼을 사용할 수 있는지 알 수 있습니다.어디서 다운로드 버튼을 볼 수있게해야합니까? 제발 도와주세요 : ( – helpme