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:
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
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 !