Pregunta

Estoy buscando crear una función de importación de texto multiproceso (generalmente CSV en SQL Server 2005) y me gustaría hacerlo en VB.NET, pero no estoy en contra de C#.Tengo la versión de prueba de VS 2008 y no sé por dónde empezar.¿Alguien puede indicarme dónde puedo mirar y jugar con la fuente de un MUY ¿Aplicación simple de subprocesos múltiples para VS 2008?

¡Gracias!

¿Fue útil?

Solución

el referenciado DevX El artículo es de 2001 y .Net Framework 1.1, pero hoy .Net Framework 2.0 proporciona la FondoTrabajador clase.Esta es la clase de subprocesos recomendada si su aplicación incluye un componente de interfaz de usuario en primer plano.

De Subprocesos y subprocesos de MSDN:

Si necesita ejecutar subprocesos de fondo que interactúen con la interfaz de usuario, el .NET Framework versión 2.0 proporciona un componente de trabajo en segundo plano que comunica el uso de eventos, con mariscal de subprocesos al hilo de interfaz de usuario.

Este ejemplo de Clase de trabajador en segundo plano de MSDN muestra una tarea en segundo plano, un porcentaje de progreso y una opción de cancelación.(El ejemplo es más largo que el ejemplo de DevX, pero tiene mucha más funcionalidad).

Imports System.ComponentModel

Partial Public Class Page
    Inherits UserControl
    Private bw As BackgroundWorker = New BackgroundWorker

    Public Sub New()
        InitializeComponent()

        bw.WorkerReportsProgress = True
        bw.WorkerSupportsCancellation = True
        AddHandler bw.DoWork, AddressOf bw_DoWork
        AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged
        AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted

    End Sub
    Private Sub buttonStart_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        If Not bw.IsBusy = True Then
            bw.RunWorkerAsync()
        End If
    End Sub
    Private Sub buttonCancel_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        If bw.WorkerSupportsCancellation = True Then
            bw.CancelAsync()
        End If
    End Sub
    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

        For i = 1 To 10
            If bw.CancellationPending = True Then
                e.Cancel = True
                Exit For
            Else
                ' Perform a time consuming operation and report progress.
                System.Threading.Thread.Sleep(500)
                bw.ReportProgress(i * 10)
            End If
        Next
    End Sub
    Private Sub bw_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        If e.Cancelled = True Then
            Me.tbProgress.Text = "Canceled!"
        ElseIf e.Error IsNot Nothing Then
            Me.tbProgress.Text = "Error: " & e.Error.Message
        Else
            Me.tbProgress.Text = "Done!"
        End If
    End Sub
    Private Sub bw_ProgressChanged(ByVal sender As Object, ByVal e As ProgressChangedEventArgs)
        Me.tbProgress.Text = e.ProgressPercentage.ToString() & "%"
    End Sub
End Class

Otros consejos

Este es un gran artículo:

http://www.devx.com/DevX/10MinuteSolution/20365

En particular:

Dim t As Thread
t = New Thread(AddressOf Me.BackgroundProcess)
t.Start()

Private Sub BackgroundProcess()
   Dim i As Integer = 1
   Do While True
        ListBox1.Items.Add("Iterations: " + i)
        i += 1
        Thread.CurrentThread.Sleep(2000)
   Loop
End Sub

El mejor documento de subprocesos que encontré fue este http://www.albahari.com/threading/

Si se me permite, el problema con los ejemplos simples es que a menudo son demasiado simples.Una vez que haya superado el conteo u ordenado las demostraciones en segundo plano, generalmente necesitará actualizar la interfaz de usuario o algo similar, y hay algunos problemas.De manera similar, rara vez tiene que lidiar con la contención de recursos en ejemplos simples y hacer que los subprocesos se degraden correctamente cuando un recurso no está disponible (como una conexión Db) requiere reflexión.

Conceptualmente necesitas decidir cómo vas a distribuir tu trabajo entre los hilos y cuántos quieres.Hay una sobrecarga asociada con la gestión de subprocesos y algunos mecanismos utilizan un grupo de subprocesos compartido que podría estar sujeto a la contención de recursos (por ejemplo, cada vez que ejecuta un programa que simplemente muestra un formulario vacío, cuántos subprocesos ve en el administrador de tareas).

Entonces, para su caso, los hilos que realizan la carga real deben enviar una señal si se completaron, si fallaron (y cuál fue la falla).El controlador debe poder ocuparse de ellos y gestionar los procesos de inicio/parada, etc.

Finalmente (casi), asumir que hacer algo multiproceso aumentará el rendimiento no siempre es cierto.Si, por ejemplo, corta un archivo en segmentos pero tiene que viajar a través de un enlace de baja velocidad (por ejemplo, ADSL), estará limitado por fuerzas externas y no habrá ningún truco que pueda solucionarlo.Lo mismo puede aplicarse a las actualizaciones de bases de datos, solicitudes web, cualquier cosa que involucre grandes cantidades de E/S de disco, etc.

A pesar de todo esto, no soy el profeta de la fatalidad.Las referencias aquí son más que adecuadas para ayudarte a lograr lo que deseas, pero ten en cuenta que una de las razones por las que enhebrar parece complicado es porque puede serlo :)

Si desea tener más control que BackgroundWorker/Threadpool pero no quiere hacerlo todo usted mismo, hay al menos dos muy buenas bibliotecas de subprocesamiento gratuitas disponibles (Wintellect y PowerThreading).

Salud

Simón

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top