2016-07-18 3 views
1

Я изменяю уровень доступа к данным старого приложения WinForms/ADO, чтобы получить объекты Salesforce с помощью soql над асинхронным остатком developerforce api. Следующий подход обычно не работает, за исключением того, что один из моих тринадцати таблиц подпрограмм не возвращает из() System.Data.DataRowCollection.Add() метод AddMyTableRow:Загрузите данные асинхронно в мой DataTable в Windows Forms

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), это сработает. Я чувствую, что что-то происходит в async/threading/context, но поскольку он не генерирует какую-либо ошибку или исключение, я не знаю, что делать дальше.

Приветствия, Джефф

ответ

5

Вы можете иметь метод асинхронного который возвращает Task<DataTable>, а затем в асинхронном виде Load обработчика событий или в методе асинхронной, который вы хотите выполнить привязку данных, ждете назвать его, а затем использовать результат привязки к сетке.

Пример

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; 
} 
Смежные вопросы