Tengo un bloque de código existente con consultas de Linq a SQL y solicitudes HTTP, que me gustaría sincronizar con el propósito de usar menos subprocesos.
¿Bastará con poner el bloque de código en un método asíncrono, así?
public async Task<Customer> ProcessACustomer() { return await GetCustomer(); } public Task<Customer> GetCustomer() { // Linq to SQL query here // HTTP request here Customer customer; return Task.FromResult<Customer>(customer); } ... o tengo que hacer que cada parte de la lógica en GetCustomer() sea asíncrona para lograr esto?
Mi obstáculo aquí es que tengo un montón de lógica en ese método (simplificado anteriormente), por lo que el tiempo será un problema. Además, parece que no puedo convertir mis consultas Linq To SQL a asincrónicas, ya que los métodos de extensión asincrónica no están disponibles por alguna razón (System.Data.Linq.Table no contiene una definición para FirstOrDefaultAsync() f.ex.) .
¿Bastará con poner el bloque de código en un método asíncrono, así?
No. El método GetCustomer no es asíncrono. Sincrónicamente realiza su trabajo y luego devuelve una tarea completada. Esto no guardará ningún hilo.
¿Tengo que hacer que cada parte de la lógica en GetCustomer() sea asíncrona para lograr esto?
Si desea convertir a async , debe comenzar en el extremo opuesto. No comience con el objetivo de hacer que ProcessACustomer (o GetCustomer ) sea asíncrono. En su lugar, comience con la API de nivel más bajo. Cualquiera que sea su método de acceso a la base de datos, hágalo asíncrono primero y luego deje que el async crezca a partir de ahí.
Mi obstáculo aquí es que tengo un montón de lógica en ese método (simplificado anteriormente), por lo que el tiempo será un problema.
Esta es una compensación clásica. Puede valer la pena convertirlo a async , o puede valer la pena comprar algunos servidores más en su lugar.