Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Threading et SqlFileStream. Le processus ne peut pas accéder au fichier spécifié car il a été ouvert dans une autre transaction

La transaction n'est pas transmise au Parallel.ForEach , vous devez saisir manuellement la transaction.

//Switched to a thread safe collection.
var documents = new ConcurrentQueue<ExtractedContent>();
using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    var attachments = await dao.GetAttachmentsAsync();
    //Grab a reference to the current transaction.
    var transaction = Transaction.Current;
    Parallel.ForEach(attachments, a =>
    {
        //Spawn a dependant clone of the transaction
        using (var depTs = transaction.DependentClone(DependentCloneOption.RollbackIfNotComplete))
        {
            documents.Enqueue(a.ToDbDocument());
            depTs.Complete();
        }
    });

    ts.Complete();
}

Je suis également passé de List<ExtractedContent> à ConcurrentQueue<ExtractedContent> car vous n'êtes pas autorisé à appeler .Add( sur une liste à partir de plusieurs fils de discussion en même temps.