none
Metodos asincronicos en Interfaz RRS feed

  • Pregunta

  • Hola estoy desarrollando una aplicación en ASP NET MVC 5, estoy implementando con interfaces, repositorios e inyección de dependencias y que se ejecute asincronicámente. El problema es que quiero implementar los métodos asincronicamente y me da el siguiente error "El modificador async no es valido para este elemento". Si alguien me puede ayudar en esto se lo agradecería. De antemano muchas gracias.

    Acá esta el código.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;

    namespace LogicaClass.Interfaces
    {
        public interface IRepositoryBase<TEntity> where TEntity : class
        {
            async void Add(TEntity obj);
            Task<TEntity> GetById(int id);
            Task<IEnumerable<TEntity>> GetAll();
            Task<TEntity> Update(TEntity obj);
            Task<TEntity> void Remove(TEntity obj);
            static async void Dispose();
        }


    Juan Lobos


    • Editado jhon1121 viernes, 15 de julio de 2016 21:47
    viernes, 15 de julio de 2016 21:46

Todas las respuestas

  • Hola,

    Creo que tu problema es que estas poniendo en tus contratos de interface async cuando esta debería estar en la implementación de la interface.

    Te dejo un ejemplo para que te guies:

    namespace LogicaClass.Interfaces
    {
        public interface IRepositoryBase
        { 
            Task Add(TEntity obj);
        }

    namespace LogicaClass.Implementaciones
    {
       

      public async Task Add(TEntity obj)
            {
                await Task.Factory.StartNew(() => _logica.Add(obj));
            }


    }

    viernes, 15 de julio de 2016 23:36
  • hola

    porque defines el Dispose como static ? ademas no deberias definir alguna interface IDisposable para que tenga valides

    cuando marca el error en que linea lo hace ?

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    sábado, 16 de julio de 2016 2:49
  • Gracias Leandro por responder:

    He leido las respuestas que me has mandado, mi consulta es la siguiente, al dejarlo solo asi:

    Task Add(TEntity obj);

    Al implementar el metodo en la logica y no tener este un void, me va a exigir si o si que le retorne un valor, ya que yo le habia puesto un void para que no me retornara nada, al fin y al cabo lo que hago con este metodo es pasarle un objeto al metodo y que lo guarde en la base de datos.

    Y en las lineas que da error son estas:

    async void Add(TEntity obj);

    Task<TEntity> void Remove(TEntity obj);
     static async void Dispose();

    Y la verdad puese static para ver si se me corregia el error, ya que aun tengo poco conocimiento con los metodos asincronos

    De antemano gracias.


    Juan Lobos

    sábado, 16 de julio de 2016 17:28
  • Hola,

    Te comento algo a ver si te es util:

    Un método async puede devolver Task<T>, Task o void.            

    Task<T> y Task retornan un método async y puede ser esperado (awaitable).

    Void retorna un método asyn pero no puede ser esperado (awaitable), en otras palabras es un "tira y olvida". No hay forma de saber cuándo se ejecuta.

    Se aconseja devolver void solamente cuando es necesario, ya que los Tasks son awaitable, mientras que void no lo es.

    Por ejemplo, usar void en un Event Handler asincrónico.

    Espero sea de tu ayuda.

    sábado, 16 de julio de 2016 23:12
  • Gracias a todos por sus comentarios.Ya lo he podido implementar, pero tengo un problema en el controlador ahora. Les muestro mi codigo.

    private readonly ProductosRepository _prod = new ProductosRepository();
            // GET: Productos
            public async  Task<ActionResult> Index()
            {
                var productoViewModel = Mapper.Map<IEnumerable<Productos>,IEnumerable<ProductosViewModels>>(_prod.GetAll());
                return View(productoViewModel);
            }

    Me sale el siguiente error:no se puede convertir de System.Threading.Tasks<System.Collections.Generic.IEnumerable<Productos>> a System.Collections.Generic.IEnumerable<Productos>

    Atte.


    Juan Lobos



    • Editado jhon1121 domingo, 17 de julio de 2016 17:45
    domingo, 17 de julio de 2016 17:39