2016-07-18 1 views
1

이전 WinForms/ADO 앱의 데이터 액세스 레이어를 수정하여 비동기 developerforce 나머지 api에서 soql을 사용하여 Salesforce 개체를 가져옵니다. 다음 방법은 일반적으로 결코 내 열세 테이블 루틴 하나를 제외하고, 작동하지 않는 AddMyTableRow (System.Data.DataRowCollection.Add()) 메소드로부터 반환Windows Forms의 DataTable에 데이터를 비동기 적으로로드하십시오.

public void LoadData() { 
    var tasks = new List<Task<int>> { 
     GetObject1Async(), 
     GetObject2Async(),... 
     GetObject13Async() 
    }; 
    Task.WaitAll(tasks.ToArray()); 
    //do some postprocessing now that I have all the data 
} 

async Task<int> GetObject1Async(){ 
    var response = await cnx.QueryAsync<dynamic>("SELECT foo FROM bar").ConfigureAwait(false); 
    foreach (var rec in response.Records){ 
     var row = MyDataSet.MyTable.NewMyTableRow(); 
     row.Name = rec.Name; ... 
     MyDataSet.MyTable.AddMyTableRow(row); //<== Sometimes this never returns 
    } 
    return MyDataSet.MyTable.Count; 
} 

이도 올바른 접근 방식인가?

내가 전체를 주석으로 처리하면 cnx.Query ... 행이 표시되고 AddMyTableRow (dummyData)가 호출된다는 것을 알았습니다. 어떤 종류의 비동기/스레딩/컨텍스트가 진행되고있는 것처럼 느껴지지만 어떤 종류의 오류 또는 예외도 생성하지 않기 때문에 계속 진행할 필요가 없습니다.

건배, 제프

답변

5

당신은, 데이터 바인딩 수행 할 호출 기다리고 비동기 형태 Load 이벤트 핸들러 또는 비동기 방식에서 다음 비동기 Task<DataTable>을 반환하는 방법을 가질 수 있습니다, 다음 사용 결과를 그리드에 바인딩합니다.

public async Task<DataTable> GetDataAsync() 
{ 
    var dt = new DataTable(); 
    var cn = @"Your Connection String"; 
    var cmd = @"SELECT * FROM Category"; 
    var da = new SqlDataAdapter(cmd, cn); 
    await Task.Run(() => { da.Fill(dt); }); 
    return dt; 
} 

private async void Form1_Load(object sender, EventArgs e) 
{ 
    var data = await GetDataAsync(); 
    this.dataGridView1.DataSource = data; 
} 
관련 문제