2012-02-14 8 views
7

Estoy aprendiendo programación asincrónica usando C# y generalmente uso BeginInvoke, pero no estoy muy seguro sobre los otros métodos para crear aplicaciones asincrónicas.¿Cuántos modelos de desarrollo asincrónico en .NET?

he hecho una pregunta acerca de esto, ver enlace más abajo para más detalles:

How to return T value from BeginInvoke?

En enlace anterior, Gravell dijo que hay cuatro modelos de desarrollo asincrónico

Hay al menos 4, entonces - una devolución de llamada regular (no APM, no EAP) tampoco es infrecuente

Pero desbordamiento dijo que hay tres:

Hay 3 modelos de desarrollo asincrónico de .NET

  • APM - (BeginXXX/EndXXX) que se está utilizando aquí, cuando la carrera de larga tarea se completa, se llama de nuevo en su código en el método EndXXX

  • EAP - Evento basado. En este modelo, cuando la tarea de larga ejecución se completa, se genera un evento para informar su código.

  • TPL - Nuevo en .NET 4, esta es la versión basada en tareas. Se parece más a la programación sincrónica al código del cliente, utilizando una interfaz fluida. Sus llamadas vuelven a su código usando ContinueWith.

¿Alguien puede ayudarme en esto?

He buscado google.com mucho, pero en realidad están usando BeginInvoke más. gracias por tu ayuda.

Respuesta

3

Thread.Start - brutal

delegate.BeginInvoke/EndInvoke - 'viejo' estándar

ThreadPool.QueueUserWorkItem - inteligente

TaskFactory.StartNew - la única manera de hacerlo correcto (según Patterns of parallel programming libro | Te recomiendo que leas primero para la desambiguación)

+0

Gracias por su respuesta, ¿qué tal el modelo basado en eventos? – CharlieShi

+1

@ CharlieShi es solo un patrón macro que se puede hacer fácilmente con uno de estos "métodos para crear operaciones asincrónicas". no importa cuál elegirías. Por cierto, en .NET 5 va a haber un método unificado de creación de métodos asíncronos con las palabras clave 'async/await' – Mikant

+0

, entonces creo que en .net 5, es más fácil para nosotros manejar la función asincrónica. ¿Qué hay de WPF? Lo estoy aprendiendo ahora, no sé si hay un futuro brillante para aprenderlo. – CharlieShi

1

Sin duda será útil aprender los métodos que Mikant describió para el desarrollo asincrónico. Solo quería darle una advertencia a pesar de que C# 5.0 está rediseñando completamente la forma en que el lenguaje trata con la asincronización. Este será su tema principal junto con la introducción de dos nuevas palabras clave, asincrónico y de espera. Simplemente llame a await en una tarea de ejecución prolongada y comenzará la tarea y devolverá el control al método de llamada. Una vez que la tarea se completa, procede con el resto del código.

Aquí hay un excelente video para conocer todos los detalles de su uso y explicación. No solo describe la forma antigua de realizar operaciones asincrónicas sino una revisión completa del nuevo estilo.Hace que escribir aplicaciones asíncronas sea mucho más fácil y mucho más legible con un flujo natural.

Este es el futuro del comportamiento asincrónico de C# que vale la pena aprender.

http://channel9.msdn.com/events/PDC/PDC10/FT09/

+1

+1. Jon Skeet también tiene una gran cantidad de información sobre la nueva funcionalidad 'async' en su serie de publicaciones de blog" EduAsync ": http://msmvps.com/blogs/jon_skeet/archive/tags/Eduasync/default.aspx – CodingWithSpike

+0

@ rally25rs Thx for el sitio web que recomienda, Appruebe mucho el sitio web. – CharlieShi

1

Hay mucho que puede ser capturado en el término "desarrollo asincrónico."


Por un lado, usted podría querer ejecutar código en un subproceso de fondo. Recientemente actualicé un blog post of mine que contrasta varios enfoques comunes para ejecutar el código en segundo plano. Aquí está la lista, en orden desde el más deseable a menos:

  1. Task (tal como se utiliza por async/esperan).
  2. Task (como lo utiliza la Biblioteca de tareas paralelas).
  3. BackgroundWorker.
  4. Delegate.BeginInvoke.
  5. ThreadPool.QueueUserWorkItem.
  6. Thread

Por otro lado, usted podría querer representan una operación asíncrona (que pueden o no estar código real se ejecuta en un subproceso en segundo plano). En ese caso, hay varios enfoques, con el fin de más deseable a menos:

  1. Task (en el estilo de la Task-based Asynchronous Pattern (TAP))
  2. IAsyncResult con Begin*/End* métodos (que tiene el nombre desafortunado Asynchronous Programming Model (APM)).
  3. Un componente escrito usando Event-based Asynchronous Pattern (EAP).

(Como nota al pie, BackgroundWorker es EAP, y Delegate.BeginInvoke es APM).


Por otro lado, usted podría significar programación asincrónica en general, que puede ser interpretado en el sentido de un enfoque reactivo. En este caso, solo conozco dos enfoques:

  1. Reactive Extensions (Rx).
  2. Event-based Asynchronous Pattern (EAP).

Sin embargo, se podría argumentar que cualquier programa orientado a eventos es reactivo, en cierta medida, por lo que sólo el manejo de eventos de interfaz de usuario es una forma (simple) de la "programación asincrónica."


Además, estos son solo los modelos comunes. Cualquier plataforma o biblioteca puede agregar más.He aquí algunos fuera de la parte superior de mi cabeza:

  • Socket La clase tiene una forma especial de APM que se puede utilizar para reducir al mínimo las asignaciones de memoria. Funciona de manera muy similar a APM pero no se ajusta al patrón.
  • El tiempo de ejecución de WinRT (viene en Windows 8) tiene sus propias representaciones de las operaciones asincrónicas (IAsyncOperation<TResult> y IAsyncInfo).
  • Windows Phone tiene soporte específico para background agent, que le permite ejecutar código en segundo plano, incluso si su aplicación no se está ejecutando actualmente.
Cuestiones relacionadas