Red de conocimiento informático - Problemas con los teléfonos móviles - El mecanismo de delegación asincrónica de vb.net, es mejor explicarlo con información detallada relevante, ¡soy un novato!

El mecanismo de delegación asincrónica de vb.net, es mejor explicarlo con información detallada relevante, ¡soy un novato!

El llamado delegado es en realidad un puntero a una función en C/C++ y tiene otras funciones de mejora de robustez, como la verificación de tipos. Existen requisitos de formato para llamar asincrónicamente a funciones de devolución de llamada. Los llamados requisitos de formato son los requisitos para la cantidad de parámetros y el orden de los tipos. Debe leer la documentación específica.

Todas las funciones de devolución de llamada en .NET Framework son AsyncCallBack.

La llamada programación asincrónica significa que usted solicita hacer una cosa, pero antes de completarla, puedo continuar haciendo la siguiente. Cuando se complete, habrá un mecanismo para notificar. yo de esto La cosa está hecha. Por el contrario, el proceso de esperar hasta que se complete la siguiente operación se puede llamar sincronización. En términos generales, los programas que escribimos suelen ser "sincrónicos" o, más apropiadamente, "ejecución secuencial", mientras que "asincrónicos" pueden describirse como "ejecución caótica".

Como puedes ver, el código síncrono es muy fácil de escribir porque podemos predecir el orden y las circunstancias de ejecución. El código asincrónico no es tan fácil de escribir porque no tenemos forma de saber qué estoy haciendo o hasta dónde he llegado cuando se completa el código. Escribir este tipo de código solía ser engorroso: creaba su propio hilo para manejar transacciones asincrónicas y luego creaba un vínculo entre ese hilo y el hilo principal. Ahora la mayor parte de este proceso ha sido encapsulado por el sistema. Siempre que llame a BeginXXX, el sistema creará automáticamente un nuevo hilo para que usted maneje este asunto. El hilo actual no se bloqueará y podrá pasar inmediatamente al siguiente paso. Esto se logra "asincrónico". Pero de mi conferencia anterior, debes saber que iniciar una operación asincrónica no es el final. También debes poder saber si la operación se completó y manejarla en consecuencia. Entonces, cuando llama a BeginXXX, debe pasar una función de devolución de llamada, que en .NET se pasa como delegada. En .NET, las funciones de devolución de llamada se pasan como delegados. La función de devolución de llamada significa "devolución de llamada", o A llama a B y pasa la dirección de la función C, de modo que B llamará a la función C especificada por A en las circunstancias especificadas.

En esta función de devolución de llamada, podemos realizar algún trabajo de seguimiento, como continuar con el trabajo de la misma naturaleza o realizar el procesamiento correspondiente. Aquí es posible que queramos saber qué sucedió y cuáles fueron los resultados de la ejecución, y podemos obtener esta información a través de EndXXX. En otras palabras, combinando AsyncCallBack y BeginXXX mencionados anteriormente, podemos confundirnos por los dos puntos siguientes:

IAsyncResult

stateObject

Primero, IAsyncResult es una interfaz que apunta a un objeto específico obtenido como parámetro en la función de devolución de llamada y a un objeto específico obtenido como parámetro en la función de devolución de llamada. Esta es una interfaz, no nos importa qué tipo de objeto obtenemos como parámetro en la función de devolución de llamada, solo necesitamos acceder a él de acuerdo con la definición de la interfaz. En pocas palabras, esta interfaz especifica el conjunto mínimo de información necesaria para completar con éxito una operación asincrónica. En términos generales, necesitamos este parámetro (ar) para identificar operaciones asincrónicas. Por ejemplo, si lanza temporalmente cientos de solicitudes asincrónicas para "obtener datos de diferentes conexiones de red", cuando se completa una solicitud, ¿cómo determina qué solicitud se ha completado? De hecho, generalmente no es necesario participar en el juicio. Solo necesita pasar este ar a EndXXX, y EndXXX emitirá su propio juicio en función de este ar. Cabe señalar que este ar es el valor de retorno cuando llama a BeginXXX, que se puede decir que es un código auxiliar. Si necesita finalizar la operación antes de que se complete, también puede pasar el código auxiliar a EndXXX, y EndXXX terminará. la operación según la situación. (IsCompleted dentro de IAsyncResult proporciona un juicio sobre si se completó y EndXXX determina si la operación debe finalizarse en función de este valor). Por supuesto, no es necesario que te preocupes por él).

A continuación, veamos stateObject, también conocido como objeto de estado.

Quizás estés pensando: ¿No es eso también un estado? De hecho, el usuario decide stateObject y BeginXXX/EndXXX no se utilizará en absoluto. Este stateObject se cargará en AsyncState de ar. Es decir, se puede acceder a este stateObject en cualquier momento a través del código auxiliar (el valor de retorno de BeginXXX) o la función de devolución de llamada en ar. en un lugar extra, y mucho menos molestar, piense en cómo funciona esto con sus operaciones asincrónicas. Dicho todo esto, ¿de qué sirve esto? Úsalo como quieras y usa tu imaginación. Por ejemplo, puede guardarlo como la primera operación, o usarlo como indicador de señal cuando desee sincronizar entre múltiples operaciones asincrónicas, o puede manipular directamente el objeto de esta operación asincrónica (cuando x.BeginXXX pasa x al stateObject parámetro).

El primer uso es un poco redundante, el segundo uso es un poco complicado y el tercer uso es el que más uso. Dado que lo más probable es que esté colaborando en un servidor y el segmento de servicio debe poder responder a múltiples clientes, async es imprescindible. Al mismo tiempo, debe haber varios objetos para varios clientes; por ejemplo, la conexión de red puede ser un Socket. El método o protocolo de manejo real es independiente del cliente específico, por lo que solo necesitamos un conjunto de controladores. Aquí es donde entra en juego el tercer uso, podemos codificarlo exactamente así:

Sub DataReceived(ByVal ar As IAsyncResult)

ar.AsyncState.EndReceive(ar)

ar.AsyncState.BeginReceive(...)BeginReceive(... , ar.AsyncState)

End Sub

Esto elimina la necesidad de utilizar datos adicionales Estructura para rastrear objetos vivos.