2014-03-12 4 views
0

사용자가 목록 상자 (선택 상자)에서 항목을 선택하고 "제출"버튼을 누르면 웹 응용 프로그램 (Windows 양식 아님)이 있습니다. 제출시 응용 프로그램은 SQL 쿼리를 만들고 database-fillup Datatable에 연결하여 html 코드로 변환하고 페이지에 테이블을 인쇄합니다. 내가하고 싶은 일은 제출 버튼을 누르는 순간과 테이블이 페이지에 표시 될 준비가되었을 때 이미지를 숨기고 표시하는 것입니다 (배경에 쿼리 및 건물 테이블을 수행하는 등의 일종의 표시기). . 지금까지, 이것이 내가 한 일입니다.Backgroundworker and Image

BackgroundWorker bw = new BackgroundWorker(); 

protected void Page_Load(object sender, EventArgs e) 
{   
    bw.WorkerReportsProgress = true; 
    bw.WorkerSupportsCancellation = true; 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged); 
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);  
} 

public void SQL_Query() {...database connection and fill up data table } 

protected void Submit_Button(object sender, EventArgs e) 
{ 
    //LoadingImage.Visible = true; //this does not work 

    if (bw.IsBusy != true) 
    { 
     bw.RunWorkerAsync(); 
    }      
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    BackgroundWorker worker = sender as BackgroundWorker; 

    SQL_Query(); 
} 

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if ((e.Cancelled == true)) 
    { 
     this.tbProgress.Text = "Canceled!"; 
    } 
    else if (!(e.Error == null)) 
    { 
     this.tbProgress.Text = ("Error: " + e.Error.Message); 
    } 
    else 
    { 
     //when the query is completed, customize the data and print it on page as label 

     LoadingImage.Visible = false; 

     if (SQLQuery_Table.Rows.Count >= 1) 
     { 
      CustomizedTable(SQLQuery_Table); 
     } 

     string str = Display_Table(); 
     label.Text = str 

    } 
} 

이제 코드의 문제는 LoadingImage.Visible = true;이 버튼을 누르면 이미지가 더하지 않습니다. backgroundworker에 대한 다른 비슷한 게시물에 대한 제 독서에 따르면 UI가 동일한 스레드에서 작동하지 않는다고합니다. 진행 상황 표시 줄을 만들고 싶지 않아 Reportprogress를하는 데 관심이 없습니다. 간단히 제출 버튼을 눌렀을 때 나타나는 이미지를 bw_RunWorkerCompleted에서 사라지게합니다. 사용자가 제출 버튼을 누를 때 이미지가 나타나게하려면 어떻게해야합니까? 나는 이미지를 위해서 또 다른 backgroundworker를 만드는 것을 피할 수 있다면 간단하게 유지하고 싶습니다. 감사!

답변

0

당신은

<asp:UpdateProgress id="updateProgress" runat="server"> 
    <ProgressTemplate> 
     <div style="position: fixed; text-align: center; height: 100%; width: 100%; top:0; right: 0; left: 0; z-index: 9999999; background-color: #000000; opacity: 0.7;"> 
      <asp:Image ID="imgUpdateProgress" runat="server" ImageUrl="~/images/ajax-loader.gif" AlternateText="Loading ..." ToolTip="Loading ..." style="padding: 10px;position:fixed;top:45%;left:50%;" /> 
     </div> 
    </ProgressTemplate> 
</asp:UpdateProgress> 
1

BackgroundWorker 거의 쓸모 ASP 응용 프로그램에서입니다 ... 그래서 같은 .gif 중요 로딩 이미지를 사용할 수 있습니다. 비동기 작업을 시작하면 클라이언트에 응답을 보냅니다. 응답을 클라이언트에 다시 보내면 더 이상 응답에 영향을 줄 수 없습니다.. 설명중인 매너에서 비동기 작업의 결과를 기반으로 UI를 변경할 수 없습니다.

이 작업을 수행하는 유일한 방법은 서버가 클라이언트에 새 정보를 보낼 수 있도록 클라이언트에게 작업에 대한 업데이트를 요청할 수있는 새로운 요청을 보내는 것입니다.

+0

사실, LoadingImage.Visible = false는 비동기 작업이 완료 되었기 때문에 bw_RunWorkerCompleted에서 작동합니다. 그래서 bw.RunWorkerAsync()를하기 전에 왜 LoadingImage.Visible = true를하지 않습니까? 왜 작동하지 않는거야? – user2848183

+0

@ user2848183 비동기 작업이 완료되면 응답을 변경하기에는 너무 늦습니다. 그것은 이미 보냈습니다. 여기에 설정된 양방향 의사 소통은 없습니다. 클라이언트가 요청하면 서버는 응답을 보냅니다. 어떤 이유로 든 언제든지 코드가 UI에 영향을 줄 수있는 클라이언트/서버 관계가없는 데스크톱 응용 프로그램과는 다릅니다. – Servy

+0

이제 괜찮습니다. 이 문제를 어떻게 해결할 수 있을까요? 내가 2 배경 작업자 (한 이미지와 다른 SQL 쿼리) 할 필요가 있고 그들을 동기화 할 수 있습니까? 어떤 예도 있으면 감사하겠습니다! – user2848183