Question

Je souhaite créer une fonction d'importation de texte multithread (généralement CSV dans SQL Server 2005) et souhaiterais le faire dans VB.NET, mais je ne suis pas contre C #. J'ai le procès VS 2008 et je ne sais pas par où commencer. Quelqu'un peut-il m'indiquer où je peux regarder et jouer avec la source d'une simple application multithread VERY pour VS 2008?

Merci!

Était-ce utile?

La solution

L'article DevX référencé date de 2001 et de .Net Framework 1.1. Aujourd'hui, .Net Framework 2.0 fournit le Classe BackgroundWorker . C'est la classe de thread recommandée si votre application comprend un composant d'interface utilisateur de premier plan.

De Filets de discussion MSDN :

  

Si vous devez exécuter des threads d'arrière-plan   qui interagissent avec l'interface utilisateur,   le .NET Framework version 2.0   fournit un composant BackgroundWorker   qui communique en utilisant des événements, avec   cross-thread marshaling à la   thread d’interface utilisateur.

Cet exemple tiré de Classe MSDN BackgroundWorker s'affiche. une tâche en arrière-plan, une progression% et une option d'annulation. (L'exemple est plus long que l'exemple DevX, mais a beaucoup plus de fonctionnalités.)

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

Autres conseils

Ceci est un excellent article:

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

En particulier:

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

Le http://www.albahari.com/threading/ meilleur document thématique que j'ai jamais trouvé est celui-ci.

Si vous me le permettez, le problème avec les exemples simples est qu’ils sont souvent trop simples. Une fois que vous avez dépassé le comptage ou le tri dans les démos d'arrière-plan, vous devez généralement mettre à jour l'interface utilisateur ou similaire, et il y a quelques pièges à éviter. De même, il est rare que vous ayez à traiter des conflits de ressources dans des exemples simples et que réfléchir les threads se dégradent de manière harmonieuse lorsqu'une ressource n'est pas disponible (telle qu'une connexion Db), cela demande de la réflexion.

Sur le plan conceptuel, vous devez décider de la manière dont vous allez répartir votre travail sur les threads et du nombre souhaité. Il existe une surcharge liée à la gestion des threads et certains mécanismes utilisent un pool de threads partagés pouvant être sujet à des conflits de ressources (par exemple, chaque fois que vous exécutez un programme qui affiche simplement un formulaire vide, combien de threads voyez-vous sous le gestionnaire de tâches).

Donc, dans votre cas, les threads effectuant le téléchargement doivent signaler en retour s’ils ont terminé, s’ils ont échoué (et en quoi consistait l’échec). Le contrôleur doit pouvoir traiter ces problèmes et gérer les processus de démarrage / arrêt, etc.

.

Enfin, presque (presque), en supposant que faire quelque chose de multithread augmentera les performances, ce n'est pas toujours vrai. Si, par exemple, vous coupez un fichier en segments mais que celui-ci passe par une liaison à faible vitesse (ADSL, par exemple), vous êtes contraint par des forces externes et aucune ruse de filetage ne résoudra ce problème. Il en va de même pour les mises à jour de base de données, les requêtes Web, tout ce qui concerne de grandes quantités d’E / S disque, etc.

.

Malgré tout cela, je ne suis pas le prophète de malheur. Les références ici sont plus que suffisantes pour vous aider à réaliser ce que vous voulez, mais sachez que l’une des raisons pour lesquelles l’enfilage semble compliqué est qu’elle peut être:)

Si vous voulez plus de contrôle que BackgroundWorker / Threadpool mais que vous ne voulez pas tout faire vous-même, il y a au moins deux très bonnes bibliothèques de threads de freebie qui frappent l'endroit (Wintellect & PowerThreading)

A bientôt

Simon

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top