2016-07-20 2 views
1

У меня есть DataAdapter, который заполняет 5 DataTables в DataSet.Как использовать DataAdapter.Fill() асинхронно?

SqlDataAdapter da = new SqlDataAdapter("Select * from testTable",con); 
da.Fill(ds, 0, numberOfRowsToPutInEachDataTable, "DT1"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable , numberOfRowsToPutInEachDataTable , "DT2"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable* 2, numberOfRowsToPutInEachDataTable, "DT3"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable * 3, numberOfRowsToPutInEachDataTable, "DT4"); 
da.Fill(ds, numberOfRowsToPutInEachDataTable * 4, numberOfRowsToPutInEachDataTable, "DT5"); 

Моя цель состоит в том, чтобы каждый

da.Fill... 

запустить асинхронно, в то же время.

У меня нет опыта работы асинхронно, и мне трудно найти решение путем исследования. Может ли кто-нибудь показать мне, как я могу получить каждый из этих DataAdapter.Fill() для запуска асинхронно?

+0

Вместо того, чтобы размещать здесь несколько строк и другие строки, вы можете загрузить их все и использовать DataView для их отображения на страницах размером 500 или любой другой - если это причина их измельчения – Plutonix

+3

Нет асинхронных методов для ' DataAdapter'. Вы были бы ограничены задачами, хотя есть, вероятно, лучшие способы решения вашей проблемы. –

+0

Получение их для запуска в одно и то же время является моим единственным требованием. – Reeggiie

ответ

0

Как об использовании PLINQ:

SqlDataAdapter da = new SqlDataAdapter("Select * from testTable", con); 

IEnumerable<int> results = new string[] 
{ 
    "DT1", "DT2", "DT3", "DT4", "DT5" 
} 
.AsParallel() 
.Select((table, index) => da.Fill(ds, 
          numberOfRowsToPutInEachDataTable * index, 
          numberOfRowsToPutInEachDataTable, 
          table)); 

EDIT

Предлагаемое решение, безусловно, не рекомендуется.

Оказывается, что DataSet не поддерживает параллельные операции записи:

Этот тип является безопасным для многопоточных операций чтения. Вы должны синхронизировать любые операции записи.

+1

Это работает без ошибок, но мои 5 данных остаются пустыми в конце этого выполнения. Есть ли что-то, что мне нужно изменить? – Reeggiie

+0

@Reeggiie См. Обновленный ответ. DataSet не поддерживает одновременный доступ к записи. –

1

Вы можете использовать несколько потоки из множества Task.Run() таким образом:

Task.Run(() => 
{ 
    da1.Fill(ds.Table1); 
    this.Invoke(new Action(() => {dataGridView1.DataSource = ds.Table1;})); 
}); 
Task.Run(() => 
{ 
    da2.Fill(ds.Table2); 
    this.Invoke(new Action(() => {dataGridView2.DataSource = ds.Table2;})); 
}); 

Таким образом, данные будут загружаться с использованием 2 различных потоков одновременно без замораживания формы.

В приведенном выше коде, da1.Fill и da2.Fill вызовет другой поток в одно время. Поскольку код выполняет другой поток, кроме потока пользовательского интерфейса, для установки DataSourceDataGridView вы должны использовать Invoke.

+0

- Продолжение? С на самом деле важно? Просто поставьте 'this.Invoke' внутри' Task.Run' lambada –

+0

@ScottChamberlain Да, вы правы насчет 'ContinueWith', нам это не нужно. Я исправил это. Но о доступе к различным объектам DataTable одного DataSet, я не уверен, может ли это вызвать проблему. –

Смежные вопросы