2012-04-20 3 views
5

To mój istniejący kod, który zapisać jakieś dane do kilku tabelSqlConnection z programowania równoległego

using (SqlConnection conn = new SqlConnection("myConnString")) 
{ 
    DoWork1(conn); 
    DoWork2(conc); 
    DoWork3(conn); 
} 

Aby przyspieszyć mój kod się więc postarać się o wsparcie i .net OC i rehanged mój kod jak poniżej

using (SqlConnection conn = new SqlConnection("myConnString")) 
{ 
    ParallelOptions pw = new ParallelOptions(); 
    pw.MaxDegreeOfParallelism = Environment.ProcessorCount; 

    Parallel.Invoke(pw,()=> DoWork1(conn),()=> DoWork2(conc),()=> DoWork3(conn)); 
} 

Ale to rzuca mi wewnętrzne połączenie krytyczny wyjątek błędu z metody ExecuteNonQuery() w moim dostępu do danych layer.Is mój równoległe podejście jest nie tak?

+0

"Czy moje podejście równoległe jest złe?" - całkiem możliwe. –

Odpowiedz

8

Cóż, istnieją sposoby, aby potencjalnie być wykonane do pracy przy użyciu MARS - ale proponuję inne podejście. (Nie wiem, czy protokół MARS obsługuje używanie tego samego połączenia w wielu wątkach, nawet jeśli pozwala na wiele równoczesnych operacji.)

Zamiast próbować ponownego użycia jednego połączenia we wszystkich zadaniach równoległych, każde zadanie należy otworzyć (i zamknąć) połączenie dla siebie, i niech pulpit połączenia poradzi sobie ze stroną efektywności tego. To ogólna najlepsza praktyka w .NET, niezależnie od tego, czy używasz równoległości, czy nie: otwórz połączenie, wykonaj trochę pracy, zamknij połączenie.

+0

dziękuję panu za szybką odpowiedź. Będę próbował drugiego podejścia. (Otwórz i zamknij połączenie raz na operację) – Renushi