none
Código Task para operaciones asíncronas. RRS feed

  • Pregunta

  • Hola:

    Estoy tratando de implementar un código para operaciones asíncronas que no me den problemas de bloqueo como en los backgroundworkers, que es una lata.

    He estado mirando como podría hacerlo y buscando en google he encontrado algunas cosas y leído otras, pero bueno, se trata de si me podéis ayudar a adaptar este código a mi necesidad, la cual pasa porque le quiero enviar al elemento task que me realice las operaciones contenidas en: AccesoLogica.FormulasGrupoI() y no se muy bien como implementarlas en dichos métodos task, ya que lo que quiero es que recorra todas los procedimientos que hayan en ese método y poder "evitar" algún que otro bloqueo que me da. El ejemplo está aplicado a una pizzería, pero bueno a ver como podría adaptarlo a mi necesidad.

     Public Shared Function PrimeraEspera() As Task
            Dim miPizza = New Pizza("Pepperoni")
            Console.WriteLine("Llegamos a la pizzería a las {0} y esperamos para hacer el pedido...", DateTime.Now.ToString("T"))
            HablandoDeFutbol()
            Await Task.Delay(10000)
        Console.WriteLine("Pedimos una pizza de {0} a las {1}", miPizza.Tipo, DateTime.Now.ToString("T"))
        End Function
    
        Private Shared Function EsperandoLaPizza() As Task(Of Pizza)
            Dim dominos As New Pizzeria()
            Dim task__1 = dominos.ServirPizza("Pepperoni")
            task__1.Start()
            HablandoDeFutbol()
            'Llega el empleado y hacemos el pedido y nos quedamos esperando...
            Dim miPizza = Await task__1
    	Await Task.Delay(10000)
        Console.WriteLine("Nos traen la pizza de {0} a las {1}", miPizza.Tipo, DateTime.Now.ToString("T"))
            Return miPizza
        End Function
    
        Private Shared Sub HablandoDeFutbol()
            Console.WriteLine("...hablando de futbol...")
            Console.WriteLine("Bla bla bla....")
            Console.WriteLine()
        End Sub

    Ahí muestra resultado en la consola que no necesito, lo que mas necesito es como llamar al método : AccesoLogica.FormulasGrupoI() y después crear otro tres task para otros 3 métodos que tengo y que trabajen en pararelo.

    Bueno, no se si me he explicado bien, si no, ya me lo indicaréis.

    Un saludo.

    Gemma


    jueves, 28 de julio de 2016 10:19

Respuestas

  • Estoy tratando de implementar un código para operaciones asíncronas que no me den problemas de bloqueo como en los backgroundworkers, que es una lata.

    Eso no tiene mucho sentido. Los problemas de bloqueo son absolutamente idénticos en los Tasks y en los BackgroundWorkers. En ambos casos hay que tomar exactamente las mismas precauciones en cuanto a proteger con bloqueos las variables que se compartan entre varios hilos, evitar los interbloqueos, trasladar la ejecución al hilo principal en caso de acceder a la pantalla, evitar condiciones de carrera, etc. Cambiando el mecanismo que lanza los hilos no resuelves nada. Tendrías que examinar y comprender cuáles son los problemas concretos que experimentas y refactorizar el código para que no los sufra.
    • Marcado como respuesta gemma_campillo viernes, 29 de julio de 2016 5:08
    jueves, 28 de julio de 2016 18:45

Todas las respuestas

  • Estoy tratando de implementar un código para operaciones asíncronas que no me den problemas de bloqueo como en los backgroundworkers, que es una lata.

    Eso no tiene mucho sentido. Los problemas de bloqueo son absolutamente idénticos en los Tasks y en los BackgroundWorkers. En ambos casos hay que tomar exactamente las mismas precauciones en cuanto a proteger con bloqueos las variables que se compartan entre varios hilos, evitar los interbloqueos, trasladar la ejecución al hilo principal en caso de acceder a la pantalla, evitar condiciones de carrera, etc. Cambiando el mecanismo que lanza los hilos no resuelves nada. Tendrías que examinar y comprender cuáles son los problemas concretos que experimentas y refactorizar el código para que no los sufra.
    • Marcado como respuesta gemma_campillo viernes, 29 de julio de 2016 5:08
    jueves, 28 de julio de 2016 18:45
  • Hola Alberto:

    Gracias por responder.

    Estoy dando palos de ciego a una situación desconocida para mí y en la que no logro entender  por qué pasa. Por mas pruebas que hago en mi ordenador con bakgrounsworkers, con hilos normales, etc., em ,o ordenador funciona perfectamente pero en el portátil que tengo emite bloqueos sin dar información de donde se producen, aunque también he puesto días un tri catch en todas las fórmulas, cosa que no me gusta, perto bueno, es igual a ver si por ahí podía cazar el mensaje de: Capa Logica     False      Aceptar y nada mas, entiendo que siendo así es por una cuestión de bloqueo (en el portátil) que no pasa por el catch cosa la cual no entiendo.

    Hoy me van a dejar un ordenador a ver si es cuestión del mío que le pasa algo, pero es un tema que no lo acabo de entender y me tiene desesperada. Si funciona bien en el mío porqué no funciona en el portátil, cuando todo lo demás, pantallas, gráficos, informes, etc. van perfectamente.

    Una cosa muy rara y muy desesperante. Estoy leyendo temas de bloqueo con SysLock, etc. pero me parece que no me va a servir de mucho, cuando el mismo programa en mi ordenador no da problemas.

    Bueno querido amigo, muchas gracias como siempre y voy a seguir indagando a ver que puedo solucionar.

    Un fuerte abrazo.

    Gemma

    viernes, 29 de julio de 2016 5:08