Korzystanie z C#/.NET 3.5.SqlDataAdapter.Fill - Asynchronous approach
Obecnie zapełniam 2 DataTables jeden po drugim za pomocą SqlDataAdapter.Fill().
Chcę zapełnić oba te DataTables równolegle, w tym samym czasie, wykonując każdą asynchronicznie. Jednak nie ma asynchronicznej wersji metody Fill() - tzn. BeginFill() byłoby świetne!
Jedno podejście Próbowałem to (pseudo):
- SqlCommand1.BeginExecuteReader // 1-ty kwerendy dla DataTable1
- SqlCommand2.BeginExecuteReader // 2-ty kwerendy dla DataTable2
- SqlCommand1.EndExecuteReader
- SqlCommand2.EndExecuteReader
- DataTable1.Load (DataReader1)
- DataTable2.Load (DataReader2)
Jednakże DataTable.Load() trwa długo:
trwa 3 sekundy wykonać etap 1 do etapu 4.
kroku 5 następuje 22 sekund.
Krok 6 trwa 17 sekund.
Więc, w połączeniu 39 sekund na kroki 5 i 6.
Efektem końcowym jest, to daje mi żadnych korzyści nad prostu robi 2 SqlDataAdapter.Fills, jedną po drugiej. Chcę, aby wynik netto był taki, że cały proces trwa tylko tak długo, jak najdłuższe zapytanie (lub tak blisko jak to możliwe).
Poszukuje rekomendowanych sposobów, aby zakończyć się czymś, co jest naprawdę asynchronicznym podejściem do wypełniania DataTable.
Czy mogę po prostu samodzielnie zarządzać i przetasować 2 oddzielne wątki, z których każdy wypełnia DataTable?
Więc raz ja w kolejce każdy jeden w górę, w jaki sposób mogę się doczekać, aż oba ukończyłeś? Potrzebuję obu tabel wypełnionych, zanim będę mógł je kontynuować i przetworzyć. – AdaTheDev
Dodałem koncepcję oczekiwania do mojej odpowiedzi, jeśli to pomaga. –
@AdaTheDev, użyłbyś AutoResetEvents, który wyzwoliłbyś po zakończeniu pracy (wewnątrz każdego osobnego wątku). Zobacz odpowiedź @Neils, ponieważ podał już przykład. – James