wpf 09. procesos asíncronos y programación paralela
TRANSCRIPT
Procesos Asíncronos y Programación Paralela D A N A E A G U I L A R G U Z M Á N .
M C T , M C P , M C T S
D A N A E A G U I L A R @ G M A I L . C O M
Contenido del Módulo Lección 1. Procesos Asíncronos e Hilos
Lección 2. Programación Paralela
Lección 1. Procesos Asíncronos e Hilos
1. El modelo de hilos en WPF
2. Programación Asíncrona en .NET
3. El Objeto Dispatcher
4. BackgroundWorker
5. DispatcherTimer
1. El modelo de Hilos de WPF Single-Threaded Apartment (STA) Model
◦ Thread Affinity: Los componentes WPF le pertenecen solo al hilo que los
crea.
◦ DispatcherObject: Los componentes WPF heredan del DispatcherObject. Un DispatcherObject esta ligado a un Dispatcher.
2. Programación Asíncrona en .NET
El hilo en que se ejecutan espera que termine.
La manera estándar de realizar tareas.
Utilizar en tareas cortas que no afecten el performance.
// Síncrono TResult Foo(...);
2. Programación Asíncrona en .NET
// Modelo de Programación Asíncrona (Begin/End) IAsyncResult BeginFoo(..., AsyncCallback callback, object estado); TResult EndFoo(IAsyncResult asyncResult);
// Patrón Asíncrono basado en Eventos (Async/Completed) public void FooAsync(...); public event EventHandler<FooCompletedEventArgs> FooCompleted;
Hilo principal del
UI
3. El Objeto Dispatcher
HILO SECUNDAR
IO
Actualizar UI
Actualizar UI con
Dispatcher
3. El Objeto Dispatcher Obtener el Dispatcher:
Llamar a un método del hilo de UI de forma segura:
Verificar si es necesario usar el Dispatcher:
Dispatcher dispatcher1 = Application.Current.Dispatcher; Dispatcher dispatcher2 = this.Dispatcher; Dispatcher dispatcher3 = textBox1.Dispatcher;
dispatcher.Invoke(Delegado, DispatcherPriority.Normal, "parametros");
dispatcher.BeginInvoke(Delegado, DispatcherPriority.Normal, "parametros");
dispatcher.CheckAccess()
4. BackgroundWorker Hilo principal del UI
Hilo secundario. No se permite
actualizar el UI
RunWorkerAsync()
DoWork()
ProgressChanged()
RunWorkerCompleted()
ReportProgress()
4. BackgroundWorker BackgroundWorker worker; private void cargarAsincronamente_Click(object sender, RoutedEventArgs e) { worker = new BackgroundWorker(); worker.DoWork += worker_DoWork; worker.RunWorkerAsync(); }
void worker_DoWork(object sender, DoWorkEventArgs e) { for (int i = 0; i < 100; i++) { Thread.Sleep(100); // alguna tarea que consume tiempo } }
4. BackgroundWorker – Progreso completado
void worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
// Se ejecuta al terminar en el hilo del UI.
}
BackgroundWorker worker; private void cargarAsincronamente_Click(object sender, RoutedEventArgs e) { worker = new BackgroundWorker(); worker.DoWork += worker_DoWork; worker.RunWorkerCompleted += worker_RunWorkerCompleted; worker.RunWorkerAsync(); }
4. BackgroungWorker - Reportar Progreso (1/2) BackgroundWorker worker;
private void cargarAsincronamente_Click(object sender,
RoutedEventArgs e)
{
worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.ProgressChanged +=
worker_ProgressChanged;
worker.DoWork += worker_DoWork;
worker.RunWorkerCompleted +=
worker_RunWorkerCompleted;
worker.RunWorkerAsync();
}
4. BackgroungWorker - Reportar Progreso (2/2)
// sera invocado cada vez que se reporte progreso
void worker_ProgressChanged(object sender,
ProgressChangedEventArgs e)
{
int progreso = e.ProgressPercentage;
}
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100); // alguna tarea que consume tiempo
worker.ReportProgress(i);
}
}
4. BackgroundWorker - Cancelar el Progreso (1/2)
worker.WorkerSupportsCancellation = true;
void worker_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(100); // alguna tarea que consume tiempo
if(worker.CancellationPending)
{
e.Cancel = true;
return;
}
}
}
4. BackgroundWorker - Cancelar el Progreso (2/2)
void worker_RunWorkerCompleted(object sender,
RunWorkerCompletedEventArgs e)
{
// Se ejecuta de regreso en el hilo del UI
// cuando termina el hilo de Background
if(e.Cancelled)
{}
}
private void cancelar_Click(object sender, RoutedEventArgs e)
{
if (worker.IsBusy)
worker.CancelAsync();
}
5. DispatcherTimer
DispatcherTimer timer = new DispatcherTimer();
private void iniciarTimer_Click(object sender,
RoutedEventArgs e)
{
timer.Tick += timer_Tick;
timer.Interval = TimeSpan.FromSeconds(1);
timer.Start();
}
5. DispatcherTimer
void timer_Tick(object sender, EventArgs e)
{
// Aqui se realiza alguna operacion en cada Tick
}
private void botonTerminarTimer_Click(object sender,
RoutedEventArgs e)
{
timer.Stop();
}
Lección 2. Programación Paralela
1. Cómputo multiprocesador
2. Tareas paralelas
3. Datos paralelos
4. Task Parallel Library
5. Parallel LINQ
1. Cómputo multiprocesador Las computadoras cada vez tienen mas
cores:
2. Tareas paralelas
3. Datos paralelos
4. Task Parallel Library
4. Task Parallel Library
5. Parallel LINQ
5. Parallel LINQ