Sto ottenendo quello che penso di essere un deadlock quando si cerca di eseguire un gruppo di query LINQ in parallelo.
Sto facendo funzionare un Task.WhenAll()
su questo metodo:
public async Task<MetabuildScan> GetLatestMetabuildScanAsync(string buildId)
{
var metabuildScanStatuses = new[] { "Completed", "Referenced" };
// Get the latest metabuild scan for this image build
var latestScan = await (from scan in _qsaContext.MetabuildScans
where scan.SoftwareImageBuildId == buildId
&& metabuildScanStatuses.Contains(scan.SIScanStatus)
orderby scan.SIScanStartedOn descending
select scan).FirstOrDefaultAsync();
// If there is a related scan, then use that one, else, use the one we just got
var latestCompletedScanId = latestScan?.RelatedScanId ?? latestScan?.Id;
return await _qsaContext.MetabuildScans
.FirstOrDefaultAsync(scan => scan.Id == latestCompletedScanId);
}
Ricevo System.InvalidOperationException: A second operation started on this context before a previous operation completed. Any instance members are not guaranteed to be thread safe.
_qsaContext
stato creato utilizzando Entity-Framework Core.
All'inizio pensavo che FirstOrDefaultAsync
avrebbe risolto il mio problema ( FirstOrDefaultAsync
avevo un FirstOrDefault
non asincrono), ma non è stato così.
Mi chiedo quale sia la soluzione migliore per aggirare questo stallo. Il tavolo da cui sto selezionando è un grande tavolo, quindi non posso richiamare l'intero tavolo in memoria.
Entity Framework DbContext non è thread-safe. Non è possibile eseguire query parallele contro di esso come si sta tentando di fare.
Se è necessario disporre di un contesto condiviso per le query che è necessario attendere singolarmente e in sequenza.
Se non hanno bisogno di un contesto condiviso ma devono essere eseguiti in parallelo, è necessario disporre di un contesto separato per ogni query.
Se si utilizza un framework DI, è possibile esaminare il proprio DbContext Transient (anziché quello che sto assumendo come Scoped) e iniettarlo in una classe di query che chiamerà i metodi di query.