En el controlador c# mongodb, ¿hay métodos sincrónicos y asincrónicos disponibles como se muestra a continuación?
_mongoCollection.InsertOneAsync(entity); _mongoCollection.Insert(entity);Creo que, en la mayoría de los casos, la cantidad de trabajo realizado de forma asíncrona en la capa de acceso a datos es muy inferior. Así que estoy esperando las llamadas de la base de datos inmediatamente de la siguiente manera:
await _mongoCollection.InsertOneAsync(entity); await _mongoCollection.DeleteOneAsync(query); await _mongoCollection.Find(query).ToListAsync();Ahora mi pregunta es: mientras espero las llamadas de db de inmediato, no veo ningún uso de métodos asincrónicos aquí. Entonces, ¿debería usar métodos asíncronos? (o) ¿Debo usar métodos síncronos?
Creo que a las respuestas anteriores les falta un punto importante de asincronía; a saber, que cuando usa los métodos asíncronos **, libera el hilo en el que se encuentra mientras (la mayor parte) se completa la operación de E/S, y está disponible para su uso en otra parte de su aplicación; por ejemplo, atender otras solicitudes.
Supongamos que la base de datos de Mongo está en otro servidor. Incluso con una red rápida y una instancia rápida de Mongo, todavía son quizás 5 ms por comando, que en una CPU de 2 GHz son 10 millones de ciclos de reloj. Si bien no obtendrá todos esos para usar en la ejecución de su código, debido a varios gastos generales, aún obtendrá una ventaja si tiene una aplicación que puede usar los subprocesos adicionales de manera productiva.
Entonces, si su aplicación es, por ejemplo, un sitio web, una API o una interfaz de usuario, usaría los métodos asíncronos. Si se trata de una aplicación de consola de un solo subproceso, probablemente no obtenga ninguno de los beneficios anteriores.
--
** Esto supone que el método asíncrono de Mongo es verdaderamente asíncrono, y no solo envoltorios para los métodos de sincronización.
eso depende de si tiene algún uso de resultado en la siguiente declaración o no.
por ejemplo
void async myMethod(){ var result = funcAsync(); // do some additional work.. var data = await result; . . }arriba está el escenario en el que debe usar async await.
Ahora supongamos que tiene un método;
void async myMethod(){ var result = await funcAsync(); // here result is required before any other logic ahead . . . }aquí realmente no necesita usar async await, pero qué sucede si en un futuro cercano su sistema cambió y necesita agregar código adicional en el medio, entonces es posible que deba cambiar las firmas del método y la ubicación correspondiente donde se llama ese método.
Así que esto depende totalmente del requisito.
Realmente depende de cuáles son sus requisitos.
Por el código que ha publicado, puedo suponer que no necesita una llamada asíncrona, pero puede ser útil con la última llamada _mongoCollection.Find(...).ToListAsync()
Las llamadas asincrónicas (en mi humilde opinión) deben usarse solo cuando tiene alguna lógica independiente/compleja. En el ejemplo que mostraste, creo que solo puedes await la última llamada para hacerlo:
_mongoCollection.Insert(entity); _mongoCollection.Find(query).ToListAsync(); De esta manera, simplemente puede hacer algo de lógica adicional mientras espera ToListAsync() :
_mongoCollection.Insert(entity); Task<List<object>> _task = _mongoCollection.Find(query).ToListAsync(); // my complex logic/calculations and stuff await _task;Siendo 100% honesto, no veo ninguna otra razón para usar llamadas asincrónicas.
Mi opinión es que, según su ejemplo, el uso de llamadas asincrónicas es simplemente inútil.