VB 2010 (56) Ejecución asíncrona de comandos

    Directorio

1. Inicie una llamada asincrónica

2. Método AsyncCallback:

3. El método BindGrid define un delegado BindGridDelegate

4. Invocar llamada al método del formulario

5. Lea los datos de SqlDataReader y cree dinámicamente DataTable


       En ADO. En .NET, los objetos Command también pueden ejecutar sus comandos de forma asincrónica. Para muchas aplicaciones, especialmente las aplicaciones de Windows Forms, el uso de esta característica puede lograr una gran mejora en el rendimiento, especialmente cuando se ejecutan sentencias SQL que requieren operaciones de larga duración.
      El objeto SqICommand proporciona tres métodos de llamada asincrónicos diferentes: BeginExecuteReader, BeginExecuteNonQuery y BeginExecuteXmIReader. Cada método tiene su correspondiente método "final", que incluye EndExecuteReader, EndExecuteNonQucry y EndExecuteXmIReader.

1. Inicie una llamada asincrónica

 Private Sub testAsynchronous ()
        Dim sqlStr As String = "usp_Long_Running_Procedure"

        Dim conn As SqlConnection = GetConnection ()
        conn.ConnectionString & = "; Asynchronous Processing = true;" '异步 调用

        Dim comm As New SqlCommand (sqlStr, conn)
        comm.CommandType = CommandType.StoredProcedure

        conn.Open ()
        comm.BeginExecuteReader (AddressOf Me.AsyncCallback, comm, CommandBehavior.CloseConnection)

    End Sub

  • Llame al método auxiliar GetPubsConnection para obtener una conexión a la base de datos de pubs

Función privada GetConnection () Como SqlConnection
        Devuelve una nueva
    función de finalización SqlConnection (My.Settings.pubsConnectionString)

  •  Agregue la instrucción "; Asynchronous Processing = true;" a la cadena de conexión del objeto Connection. Esto se hace para permitir que ADO.NET realice llamadas asincrónicas a SQL Server.
  • Después de configurar la cadena de conexión, cree el objeto SqICommand e inicialícelo para ejecutar el procedimiento almacenado usp Long Running_Procedure. Este procedimiento almacenado genera un retraso de 20 segundos a través de la instrucción WAITFOR DELAY en SQL Server y luego llama al procedimiento almacenado usp_Get_All. El procedimiento almacenado usp_Get_All puede seleccionar todos los autores en la tabla de autores. El propósito de agregar un retraso aquí es ilustrar que la aplicación Windows Forms puede realizar otras tareas mientras se ejecuta el procedimiento almacenado anterior. El siguiente es el código SQL de los procedimientos almacenados usp_Long-Running_Procedure y usp_Get_All:

PROCEDIMIENTO DE ALTERACIÓN usp_Long_Running_Procedure
AS
SET NOCOUNT ON
WAITFOR DELAY '00: 00: 5 '
EXEC usp_Get_All

ALTERAR PROCEDIMIENTO usp_Get_All
AS
SELECT
au_id, au_lname, au_fname, phone, address, city, state, zip, contract
De los
autores

  • La última línea de código llama al método BeginExecuteReader. En esta llamada, primero transfiera un método de delegado del tipo de delegado System.AsyncCallback (Me.AsyncCallback), al final del método asincrónico, .NET Framework usará este delegado para regresar. Además, el objeto SqICommand que se ha inicializado se pasa para ejecutar el procedimiento almacenado. El último parámetro es el valor CommandBehavior de DataReader, aquí es commandBehavior.CloseConnection, lo que significa que cuando DataReader está cerrado, la conexión a la base de datos se cierra automáticamente.

2. Método AsyncCallback:

Private Sub AsyncCallback (ByVal ar Como IAsyncResult)
        comm Dim Como SqlCommand = CType (ar.AsyncState, SqlCommand)
        lector dévil como SqlDataReader = comm.EndExecuteReader (ar)
        vaga mesa Como DataTable = GetTableFromReader (lector, "Autores")
        Me.Invoke ( Nuevo BindGridDelegate (AddressOf Me.BindGrid), New Object () {table})
    End Sub

  • La primera línea de código obtiene el objeto SqICommand de la propiedad AsyncState del objeto entrante IAsyncResult. Al llamar al método BeginExecuteReader anteriormente, pasé mi propio objeto SqlCommand para llamar al método EndExecuteReader en la siguiente línea. Este método devuelve el objeto SqIDataReader.
  • La segunda línea de código convierte el objeto SqIDataReader al tipo DataTable (el concepto de conversión se introducirá cuando se analice DataSct más adelante).
  •  La última línea es muy importante. Si intenta vincular el objeto DataTable a la cuadrícula aquí, se producirá un error porque el subproceso que se está ejecutando actualmente no es el subproceso principal de Windows, y el método auxiliar BindGrid para el enlace de datos solo se puede invocar en el entorno del subproceso principal de Windows. Para devolver los datos al hilo principal de Windows, los datos se deben agrupar utilizando el método Invocar del objeto Formulario. El método Invoke requiere dos parámetros, el delegado del método al que desea llamar y todos los parámetros utilizados por el método.

3. El método BindGrid define un delegado BindGridDelegate

     Private Delegate Sub BindGridDelegate (tabla ByVal como DataTable)

    Private Sub BindGrid (tabla ByVal como DataTable)
        Me.DataGridView1.DataSource = Nothing
        Me.DataGridView1.DataSource = table
    End Sub

4. Invocar llamada al método del formulario

Me.Invoke (New BindGridDelegate (AddressOf Me.BindGrid), New Object () {table})

    Esta línea de código pasa en una instancia de delegado BindGridDelegate recién creada y la inicializa con un puntero al método BindGrid. De esta manera, la consulta se está ejecutando. Los hilos de trabajo NET pueden trabajar de forma segura con el hilo principal de Windows.

5. Lea los datos de SqlDataReader y cree dinámicamente DataTable

Función privada GetTableFromReader (lector ByVal como SqlDataReader, ByVal str como String) como DataTable
        Dim comm As SqlCommand = New SqlCommand ("usp_Get_All", GetConnection)
        comm.CommandType = CommandType.StoredProcedure
        'Dim mReader.Sl
        .

        reader = comm.ExecuteReader (CommandBehavior.CloseConnection)

        Dim dt As DataTable = New DataTable
        dt.TableName = str
        Dim schemaTable As DataTable = reader.GetSchemaTable ()

        'Tabla de compilación dinámica, agregue columnas
        para cada dr As DataRow In schemaTable.Rows
            Dim dc As DataColumn = New DataColumn
            ' Establezca el tipo de datos de columna ()
            dc.DataType = dr (0) .GetType ()
            'Establezca el nombre de columna ()
            dc.ColumnName = dr (0) .ToString ()
            'Agregue esta columna a la tabla construida
            dt.Columns.Add (dc)
        Siguiente
        ' Agregue datos a la tabla
        Mientras reader.Read ()
            Dim fila As DataRow = dt.NewRow ()
            'Rellene una fila de datos
            Para i = 0 To schemaTable.Rows.Count-1
                row (i) = reader (i) .ToString ()
            Next
            dt.Rows.Add (row)
            row = Nothing
        End While
        reader.Close ()
        schemaTable = Nothing
        Return dt
    End Function

Control Método de invocación

https://docs.microsoft.com/zh-cn/dotnet/api/system.windows.forms.control.invoke?view=netframework-4.8#System_Windows_Forms_Control_Invoke_System_Delegate_System_Object___

Publicado 146 artículos originales · elogiado 0 · visitas 2718

Supongo que te gusta

Origin blog.csdn.net/ngbshzhn/article/details/105626737
Recomendado
Clasificación