He utilizado CancellationTokenSource para proporcionar una función para que el usuario pueda cancelar la acción prolongada. Sin embargo, después de que el usuario aplique la primera cancelación, , la acción futura posterior ya no funciona. Supongo que el estado de CancellationTokenSource se ha establecido en Cancelar y quiero saber cómo restaurarlo de nuevo .¿Cómo restablecer el CancellationTokenSource y depurar el multithread con VS2010?
Pregunta 1: ¿Cómo restablecer la CancelaciónTokenSource después del primer uso?
Pregunta 2: ¿Cómo depurar el multihilo en VS2010? Si ejecutar la aplicación en modo de depuración, que se puede ver la siguiente excepción de la declaración
this.Text = string.Format("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId);
InvalidOperaationException era controlada por el código de usuario operación de la Cruz-hilo no válido: 'MainForm' Control se accede desde un hilo diferente del hilo en el que se creó.
Gracias.
private CancellationTokenSource cancelToken = new CancellationTokenSource();
private void button1_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
{
ProcessFilesThree();
});
}
private void ProcessFilesThree()
{
ParallelOptions parOpts = new ParallelOptions();
parOpts.CancellationToken = cancelToken.Token;
parOpts.MaxDegreeOfParallelism = System.Environment.ProcessorCount;
string[] files = Directory.GetFiles(@"C:\temp\In", "*.jpg", SearchOption.AllDirectories);
string newDir = @"C:\temp\Out\";
Directory.CreateDirectory(newDir);
try
{
Parallel.ForEach(files, parOpts, (currentFile) =>
{
parOpts.CancellationToken.ThrowIfCancellationRequested();
string filename = Path.GetFileName(currentFile);
using (Bitmap bitmap = new Bitmap(currentFile))
{
bitmap.RotateFlip(RotateFlipType.Rotate180FlipNone);
bitmap.Save(Path.Combine(newDir, filename));
this.Text = tring.Format("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId);
}
});
this.Text = "All done!";
}
catch (OperationCanceledException ex)
{
this.Text = ex.Message;
}
}
private void button2_Click(object sender, EventArgs e)
{
cancelToken.Cancel();
}
Si lo cancela, se cancela y no se puede restaurar. Necesita un nuevo CancellationTokenSource. – CodesInChaos
Encontré un artículo aquí http://blogs.msdn.com/b/pfxteam/archive/2009/05/22/9635790.aspx que indica que simplemente no podemos restablecerlo. La solución es crear un nuevo CancellationTokenSource cada vez. Eso responde mi primera pregunta. Sin embargo, todavía necesito ayuda para mi segunda pregunta. --- thx – q0987
Pruebe 1 pregunta por pregunta –