Comment utiliser entity avec le parallelisme
Bonjour,
Comme beaucoup le savent, entity n'est pas thread safe.
D'ou mon code suivant qui permet de télécharger des fichiers xml et d'en extraire des données que je met en base
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| Dim LesDatas As New EDB_V3Entities
Static Dim lock As New Object
'Liste des articles sur EDB avec mappage constructeur ICECAT
Dim query = (From art In LesDatas.Article...).ToList
'Récupération des fiches techniques mises à jour, en paralléle
Dim po As New ParallelOptions
po.MaxDegreeOfParallelism = 20
Parallel.ForEach(query, po, Sub(LArt)
Try
RefArtErr = LArt.RefArt
ConstIceErr = LArt.IdConstIceCat
SyncLock lock
GetArticleSolo(LArt, LesDatas)
LesDatas.SaveChanges()
End SyncLock
Catch ex As Exception
HelperJournal.WriteException(ex, "Ref Art:" & RefArtErr & " Const IceCat:" & ConstIceErr.ToString)
End Try
End Sub) |
Le problème est que du coup ce n'est plus vraiment du parallélisme.
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| Parallel.ForEach(query, po, Sub(LArt)
Try
RefArtErr = LArt.RefArt
ConstIceErr = LArt.IdConstIceCat
Dim Datas As New EDB_V3Entities
GetArticleSolo(LArt, Datas )
Datas .SaveChanges()
Catch ex As Exception
HelperJournal.WriteException(ex, "Ref Art:" & RefArtErr & " Const IceCat:" & ConstIceErr.ToString)
End Try
End Sub) |
Est-ce que c'est mieux? Certes je parallélise mais je crée 20 connexions simultanées à ma base, en espérant qu'à la fin du thread il fait bien le ménage. La mise à jour est sur 4 ou 5 champs d'une table. Donc le download devrait etre plus long que le save change, non ?