WPF 09. procesos asíncronos y programación paralela

25
Procesos Asíncronos y Programación Paralela DANAE AGUILAR GUZMÁN. MCT, MCP, MCTS [email protected]

Transcript of WPF 09. procesos asíncronos y programación paralela

Page 1: WPF 09. procesos asíncronos y programación paralela

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

Page 2: WPF 09. procesos asíncronos y programación paralela

Contenido del Módulo Lección 1. Procesos Asíncronos e Hilos

Lección 2. Programación Paralela

Page 3: WPF 09. procesos asíncronos y 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

Page 4: WPF 09. procesos asíncronos y programación paralela

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.

Page 5: WPF 09. procesos asíncronos y programación paralela

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(...);

Page 6: WPF 09. procesos asíncronos y programación paralela

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;

Page 7: WPF 09. procesos asíncronos y programación paralela

Hilo principal del

UI

3. El Objeto Dispatcher

HILO SECUNDAR

IO

Actualizar UI

Actualizar UI con

Dispatcher

Page 8: WPF 09. procesos asíncronos y programación paralela

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()

Page 9: WPF 09. procesos asíncronos y programación paralela

4. BackgroundWorker Hilo principal del UI

Hilo secundario. No se permite

actualizar el UI

RunWorkerAsync()

DoWork()

ProgressChanged()

RunWorkerCompleted()

ReportProgress()

Page 10: WPF 09. procesos asíncronos y programación paralela

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 } }

Page 11: WPF 09. procesos asíncronos y programación paralela

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(); }

Page 12: WPF 09. procesos asíncronos y programación paralela

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();

}

Page 13: WPF 09. procesos asíncronos y programación paralela

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);

}

}

Page 14: WPF 09. procesos asíncronos y programación paralela

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;

}

}

}

Page 15: WPF 09. procesos asíncronos y programación paralela

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();

}

Page 16: WPF 09. procesos asíncronos y programación paralela

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();

}

Page 17: WPF 09. procesos asíncronos y programación paralela

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();

}

Page 18: WPF 09. procesos asíncronos y programación paralela

Lección 2. Programación Paralela

1. Cómputo multiprocesador

2. Tareas paralelas

3. Datos paralelos

4. Task Parallel Library

5. Parallel LINQ

Page 19: WPF 09. procesos asíncronos y programación paralela

1. Cómputo multiprocesador Las computadoras cada vez tienen mas

cores:

Page 20: WPF 09. procesos asíncronos y programación paralela

2. Tareas paralelas

Page 21: WPF 09. procesos asíncronos y programación paralela

3. Datos paralelos

Page 22: WPF 09. procesos asíncronos y programación paralela

4. Task Parallel Library

Page 23: WPF 09. procesos asíncronos y programación paralela

4. Task Parallel Library

Page 24: WPF 09. procesos asíncronos y programación paralela

5. Parallel LINQ

Page 25: WPF 09. procesos asíncronos y programación paralela

5. Parallel LINQ