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

Post on 08-Apr-2017

90 views 0 download

Transcript of 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

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