Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: rigorvzla en 3 Agosto 2018, 00:42 am



Título: CancellationToken
Publicado por: rigorvzla en 3 Agosto 2018, 00:42 am
Buenas tardes , hoy tengo un problema bastante interesante que a mas de uno le gustara saber su solucion (incluyendome), el tema lo inicie con el amigo elektro mas es posible que alguien mas este pasando por lo mismo que yo y quiera saber solucion.

La pregunta inicial fue la siguiente:
Citar
Eh usado el cancellinToken para cancelar una Task, y resulta bien (ya que antes debia cerrar y abrir la aplicacion para cancelar tal accion) el problema esta en que al llamar de nuevo la Task, NO ocurre nada, me gustaria saber como puedo "reiniciar" o una vez cancelada la Task pueda reutilizarla y no quede inutil, ya que para que funcione de nuevo debo cerrar y abrir la aplicacion nuevamente...

La respuesta dada por Elektro fue la siguiente:
Citar
Hola. No se a que te refieres por "cancellinToken" pero no existe ningún miembro que se llame así en .NET Framework y que esté relacionado con la clase Task, por ende intuyo que probablemente en realidad quisiste decir la clase "CancellationToken" o bien ese "cancellinToken" al que te referiste sea un miembro que está definido en el código fuente de la librería de terceros que estés utilizando...

Respondiendo a tu duda principal, la clase Task representa una "tarea" en segundo plano (un thread) que transiciona de un estado inicial de creación a un estado final de terminación, esto significa que la tarea solo se puede iniciar una vez, y cualquier intento de volver a iniciar una tarea que no esté en el estado inicial de creación dará como resultado una excepción.

Lo que debes hacer, es crear una nueva instancia de ese objeto Task cuando se haya finalizado, y entonces ya puedes volver a iniciar. Te muestro un ejemplo:

Código:
    Action action = new Action(() => Console.WriteLine("Hello Asynchronic World!"));
     
    Task t = new Task(action);
    t.Start();
    t.Wait();
    t.Dispose();
     
    t = new Task(action);
    t.Start();
    t.Wait();
    t.Dispose();
Citar
PD: en la mayoría de casos no debes preocuparte por llamar al método Task.Dispose(), las razones se explican aquí (en la sección Remarks):

    https://msdn.microsoft.com/en-us/library/dd270681(v=vs.110).aspx

mostre la linea de codigo al cual quiero aplicar el token y en efecto como dijo elktro puedo llamarlo cuantas veces quiera mas no funciona una vez cancelado por el token la tarea.

Citar
En el código que has mostrado no hay necesidad de "reiniciar" el método 'videoDescarga', puedes llamar a dicho método cuantas veces quieras de forma consecutiva, el problema que creo debes estar teniendo es con el token de cancelación, ¿verdad?. Para simplificarlo, imagina que un token de cancelación representa estados... más o menos como una Task, el estado cancelado y el de no cancelado, y una vez cancelado no puedes volver a cancelarlo, no puedes volver a usarlo, así que debes asegurarte de renovar el token de cancelación cuando este se haya cancelado, asegúrate de hacer eso, si el token es cancelado entonces debes crear una nueva instancia de la clase CancellationTokenSource y de la clase CancellationToken para pasarle el nuevo token al método 'videoDescarga'.

Continuando con el tema, de mi problema a pesar que me han dicho que debo crear  un New token no se como hacerlo al cancelarlo, como podria hacerlo ?

el metodo de cancelacion lo tengo de la siguiente manera:
Código:
public static void cerrarVideo()
                {
                    cancellationTokenSource.Cancel();
                }

Espero puedan ayudarme con esto, ya que me tiene dando vueltas la cabeza desde hace ya un rato. Gracias !


Título: Re: CancellationToken
Publicado por: Eleкtro en 3 Agosto 2018, 23:41 pm
a pesar que me han dicho que debo crear  un New token no se como hacerlo al cancelarlo, como podria hacerlo ?

En tu código debes tener declarado un objeto del tipo CancellationTokenSource y probablemente otro del tipo CancellationToken que será una referencia corta a la propiedad Token del objeto CancellationTokenSource, es decir, algo así:

Código
  1. // Define the cancellation token.
  2. CancellationTokenSource source = new CancellationTokenSource();
  3. CancellationToken token = source.Token;

( https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken(v=vs.110).aspx (https://msdn.microsoft.com/en-us/library/system.threading.cancellationtoken(v=vs.110).aspx) )

Una vez el token ha sido cancelado no lo puedes volver a usar/volver a cancelar, tienes que crear un nuevo token, y para crear un nuevo token simplemente tienes que volver a realizar ese procedimiento (el ejemplo de código en C# que acabo de mostrar), simplemente se trata de crear una nueva instancia de la clase CancellationTokenSource como en el ejemplo de arriba, es basicamente lo mismo que te mostré en el ejemplo del objeto Task, pero usando la clase CancellationTokenSource.

Saludos


Título: Re: CancellationToken
Publicado por: rigorvzla en 4 Agosto 2018, 00:54 am
GRAAAAAACIAAAAAAAAAS!!!!! lastima no  puedo escribir un grito de cuatro vientos de agradecimiento!!!! jaja muchas muchisimas gracias, habiahecho por cuenta propia la mitad del trabajo! jajajaja y por eso no servia, elektro muchas gracias  ;-)

solo creaba esta parte
Código:
CancellationTokenSource source = new CancellationTokenSource();
mas faltaba el token como tal... Oops!

pff dormire como un bebe hoy jajajajaja , gracias nuevamente .