sql >> Databasteknik >  >> RDS >> Sqlserver

Threading och SqlFileStream. Processen kan inte komma åt den angivna filen eftersom den har öppnats i en annan transaktion

Transaktionen flödar inte in till Parallel.ForEach måste du ta in transaktionen manuellt.

//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();
}

Jag bytte också från List<ExtractedContent> till ConcurrentQueue<ExtractedContent> eftersom du inte får anropa .Add( på en lista från flera trådar samtidigt.




  1. Välj kolumn med små bokstäver med grupp efter eller välj nedre (kolumn) i Rails 4

  2. Hur man får åtkomst till MySQL med MySQL Root User

  3. SonarQube:Hur minskar man storleken på measure_data.ibd?

  4. Hur man kommer åt arrayelement