사용자가 목록 상자 (선택 상자)에서 항목을 선택하고 "제출"버튼을 누르면 웹 응용 프로그램 (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를 만드는 것을 피할 수 있다면 간단하게 유지하고 싶습니다. 감사!
사실, LoadingImage.Visible = false는 비동기 작업이 완료 되었기 때문에 bw_RunWorkerCompleted에서 작동합니다. 그래서 bw.RunWorkerAsync()를하기 전에 왜 LoadingImage.Visible = true를하지 않습니까? 왜 작동하지 않는거야? – user2848183
@ user2848183 비동기 작업이 완료되면 응답을 변경하기에는 너무 늦습니다. 그것은 이미 보냈습니다. 여기에 설정된 양방향 의사 소통은 없습니다. 클라이언트가 요청하면 서버는 응답을 보냅니다. 어떤 이유로 든 언제든지 코드가 UI에 영향을 줄 수있는 클라이언트/서버 관계가없는 데스크톱 응용 프로그램과는 다릅니다. – Servy
이제 괜찮습니다. 이 문제를 어떻게 해결할 수 있을까요? 내가 2 배경 작업자 (한 이미지와 다른 SQL 쿼리) 할 필요가 있고 그들을 동기화 할 수 있습니까? 어떤 예도 있으면 감사하겠습니다! – user2848183