2013-05-13 4 views
1

버튼 클릭시 업데이트 패널 내부에있는 Gridview를 채우고 싶습니다. 현재 gridview는 화면에 표시되지 않지만 채워집니다. 내가 뭘 놓치고 있니? updatepanel에 대한버튼 클릭시 Gridview를 비동기 적으로 채우기

public delegate void BindGrid_Delegate(); 
    protected void btnSearch_Click(object sender, EventArgs e) 
    { 
     try 
     { 
      // databind of all the controls 
      BindGrid_Delegate bd = new BindGrid_Delegate(BindGrid); 
      IAsyncResult ar = bd.BeginInvoke(null, null); //invoking the method 
     } 
     catch (Exception ex) 
     { 
      ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "PageException", "alert('" + ex.Message + "');", true); 
     } 
    } 

    private void BindGrid() 
    { 
     try 
     { 
      DataSet ResultDataSet = GetData(); 
      gvShowResult.DataSource = ResultDataSet; 
      gvShowResult.DataBind(); 
      UpdatePanel2.Update(); 
     } 
     catch (Exception ex) 
     { 
      ScriptManager.RegisterClientScriptBlock(this, this.GetType(), "PageException", "alert('" + ex.Message + "');", true); 
     } 
    } 

UpdateMode를 조건부입니다 : 다음은 내가 사용하는 코드입니다. 나는 어떤 도움을 주셔서 감사합니다.

+0

btnSearch_Click에서 BindGrid()를 직접 호출하지 않는 이유는 무엇입니까? 델리게이트와 IAsyncResult는 더 나은 실행에 도움이되지 않기 때문에 제거해야합니다. –

+0

안녕하세요, Tim BidnGrid에 직접 전화하면 매력처럼 작동합니다. 그러나 비공식 호출을 사용하려고합니다. –

답변

0

UI가 아닌 스레드에서 DataBind()Update()으로 전화하는 것이 문제 일 수 있습니다. UI 컨트롤은 해당 UI 컨트롤을 만드는 스레드에서만 수정해야합니다.

GetData() 메소드는 여전히 별도의 스레드에서 호출 할 수 있습니다 (예 : Tasks을 사용하십시오. 당신의 btnSearch_Click 방법에서

:

Task.Factory 
    .StartNew(() => GetData()) 
    .ContinueWith(t => 
    { 
     gvShowResult.DataSource = t.Result; 
     gvShowResult.DataBind(); 
     UpdatePanel2.Update(); 
    }, TaskScheduler.FromCurrentSynchronizationContext()); 

이 별도의 스레드에서 GetData()를 호출하고 UI 스레드에서 계속 실행됩니다.

+0

Dirk, 네임 스페이스 Task가 속한 헤이. 나는 Microsoft.Office.Interop.Word 만 사용할 수있는 네임 스페이스로 작업합니다. –

+0

@GargiNarain'System.Threading.Tasks' – Dirk

+0

@GargiNarain [작업 클래스] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx) 및 [ 작업 병렬 라이브러리] (http://msdn.microsoft.com/en-us/library/dd537609.aspx) – Dirk

0

코드에 여러 가지 문제가 있다고 생각합니다. 먼저 ASP .Net이 비동기 메서드를 요청의 일부로 실행하려고한다는 것을 알지 못하게합니다. 코드에서 BindGrid에 대한 비동기 호출이 완료된 후 bd.BeginInvoke()를 호출 한 후 반환해야하는 요청이 반환됩니다.

두 번째 문제는 비동기 적으로 BindGrid() 메서드를 호출하는 동안 코드에 비동기 I/O가 없으므로 데이터를 검색하는 동안 ASP .Net 스레드를 해제하지 않는다는 것입니다. BindGrid()에 대한 호출을 지연하고 있습니다. This 문서는 위의 문제와 관련하여 도움이됩니다.

.Net 4.5 옵션을 사용하는 경우 비동기 및 대기 쌍을 사용하여 비동기 동작을 만들어야합니다. ASP .Net MVC에서이를 수행하는 방법을 설명하는 this article을 확인하십시오.

+0

감사합니다 플로린, 내가 기사를 탐험하자 그리고 당신에게 돌아갈 것입니다. –

관련 문제