Ich sammle Daten von MongoDB der folgenden Methode:Wie kann der Durchsatz durch Parallelisierung des Datenbankzugriffs verbessert werden?
public IEnumerable<TOutput> GetMatchingJobs<TOutput>(JobInfoFilterParameters filterParameters, FetchOptions<JobInfoRecord, TOutput> fetchOptions)
{
var filter = CreateFilterDefinition(filterParameters);
var options = CreateFindOptions(fetchOptions, false);
return MongoDatabaseStorageService.WithRecords<JobInfoRecord, List<TOutput>>
(collection => collection.FindAsync(filter, options).Result.ToListAsync().Result);
}
/// <summary>
/// Performs an operation on the database, automatically disconnecting and retrying
/// if the database connection drops.
/// </summary>
/// <param name="operation"></param>
public TResult WithRecords<T, TResult>(Func<IMongoCollection<T>, TResult> operation)
{
try { }
finally { _lock.EnterUpgradeableReadLock(); }
try
{
return WithRecordsInternal(operation);
}
finally
{
_lock.ExitUpgradeableReadLock();
}
}
private TResult WithRecordsInternal<T, TResult>(Func<IMongoCollection<T>, TResult> operation)
{
try
{
return operation(GetCollection<T>());
}
catch (IOException)
{
// There is an issue in mongo drivers when IOException is thrown instead of reconnection attempt.
// Try repeat operation, it will force mongo to try to reconnect.
return operation(GetCollection<T>());
}
}
Ich wunderte mich über Asynchron-Betrieb wie FindAsync()
und ToListAsync()
mit .Result
Wie kann ich die Leistung zu verbessern (oder der Durchsatz durch den Datenbankzugriff Parallelisierung) mit async-await
oder was ist das richtige Muster zu verwenden async
correcty (wenn ich es kaputt)?
Sind Sie sich bewusst, dass sich aktualisierbare Schlösser gegenseitig ausschließen? Es gibt keine Nebenläufigkeit hier. Es ist identisch mit einem X-Schloss hier. das bringt die Leute manchmal in Verlegenheit. – usr
Nein, wie kann ich das beheben? – Anatoly
Nicht sicher, ich weiß nicht, warum Sie eine RW-Sperre (oder ein Schloss) verwenden. – usr