2008-09-18 19 views
2

Je cherche à créer une fonction d'importation de texte multithread (généralement CSV dans SQL Server 2005) et aimerais le faire dans VB.NET mais je ne suis pas contre C# . J'ai procès VS 2008 et je ne sais pas par où commencer. Quelqu'un peut-il me diriger dans la direction de l'endroit où je peux regarder et jouer avec la source d'un VERY simple application multithread pour VS 2008?VB.Net (ou C#) 2008 Multi Thread Import

Merci!

Répondre

2

La référence DevX article est de 2001 et de .NET Framework 1.1, mais Framework .Net 2.0 aujourd'hui fournit la classe BackgroundWorker. Cette classe de threads est recommandée si votre application inclut un composant d'interface utilisateur de premier plan.

De MSDN Threads and Threading:

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

Cet exemple de MSDN BackgroundWorker Class montre une tâche d'arrière-plan, un progrès progressif et une option d'annulation. (L'exemple est plus long que l'échantillon 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 
+0

Je l'ai utilisé avec succès le composant BackgroundWorker dans quelques VB Projets .NET. Il est difficile de battre si vos besoins en multi-threading sont assez simples. –

+0

Merci pour la mise à jour !! – Taptronic

4

Ceci est un 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 
1

A propos du meilleur document de filetage que j'ai jamais trouvé était ce http://www.albahari.com/threading/

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

D'un point de vue conceptuel, vous devez décider comment vous allez répartir votre travail entre les threads et combien vous voulez. Il y a un surcoût associé à la gestion des threads et certains mécanismes utilisent un pool de threads partagé qui pourrait être lui-même sujet à des conflits de ressources (par exemple, chaque fois que vous lancez un programme qui affiche simplement un formulaire vide). Par conséquent, dans votre cas, les threads qui effectuent le téléchargement réel doivent signaler s'ils ont terminé, s'ils ont échoué (et quel a été l'échec). Le contrôleur doit être capable de gérer ces processus et de gérer les processus de démarrage/arrêt et ainsi de suite. Enfin (presque), en supposant que faire quelque chose de multithread augmentera les performances ne reste pas toujours vrai. Si, par exemple, vous découpez un fichier en segments, mais qu'il doit traverser une liaison à basse vitesse (ADSL, par exemple), vous êtes contraint par des forces externes et aucune quantité de trucage de thread ne va contourner cela.La même chose peut s'appliquer pour les mises à jour de bases de données, les requêtes Web, tout ce qui peut impliquer de grandes quantités d'E/S de disque, etc. En dépit de tout cela, je ne suis pas le prophète de la fatalité. 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 le thread semble compliqué est parce que cela peut être :)

Si vous voulez plus de contrôle que BackgroundWorker/Threadpool mais pas veulent tout faire vous-même, il y a au moins deux très bonnes bibliothèques de filetage de billet de faveur cognement autour de la place (Wintellect & PowerThreading)

Vive

Simon

+0

Merci pour cette réponse Simon. C'est * un * excellent article/ressource !! – Taptronic