Frage

Ich suche eine Multi-Threaded-Text Importfunktion (in der Regel CSV in SQL Server 2005) zu bauen und möchte dies in VB.NET tun, aber ich bin nicht gegen C #. Ich habe VS 2008 Versuch und nur weiß nicht, wo man anfangen soll. Kann mir jemand in Richtung Punkt, wo ich auf und spielen mit der Quelle für eine sehr einfache Multi-Threaded-Anwendung für VS 2008?

aussehen kann

Danke!

War es hilfreich?

Lösung

Die referenzierte DevX Artikel ist von 2001 und .NET Framework 1.1, aber heute .Net Framework 2.0 stellt die Background Klasse. Dies ist die empfohlene Threading-Klasse, wenn Ihre Anwendung eine Vordergrund UI-Komponente enthält.

MSDN Threads und Threading :

  

Wenn Sie Hintergrund-Threads laufen   dass die Interaktion mit der Benutzerschnittstelle,   .NET Framework Version 2.0   stellt eine Komponente Background   dass in Verbindung steht Ereignisse verwenden, mit   verkanten Serialisieren zum   User-Interface-Thread.

In diesem Beispiel wird von MSDN Background Klasse zeigt eine Hintergrundaufgabe, Fortschritt% und Option abzubrechen. (Das Beispiel ist länger als die DevX Probe, aber hat viel mehr Funktionalität.)

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

Andere Tipps

Dies ist ein großer Artikel:

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

Im Einzelnen:

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

über das beste Threading Dokument, das ich je gefunden wurde diese http://www.albahari.com/threading/

Wenn ich kann, das Problem mit einfachen Beispielen ist, dass, dass sie oft zu einfach. Sobald Sie hinter dem Zählen oder Art im Hintergrund Demo erhalten müssen Sie in der Regel die Benutzeroberfläche oder ähnliches und es aktualisieren sind einige Fallstricke. Ebenso haben Sie selten mit Ressourcenkonflikten in einfachen Beispielen und mit Gewinden degradieren graziös befassen, wenn eine Ressource nicht verfügbar (wie eine Db-Verbindung) ist gedacht erfordert.

Konzeptionell müssen Sie entscheiden, wie Sie Ihre Arbeit über die Threads zu verteilen gehen und wie viele möchten Sie. Es gibt Overhead im Zusammenhang mit Verwaltung von Threads und einige Mechanismen verwenden, um einen gemeinsamen Thread-Pool, der Gegenstand könnte Anstoßes selbst Ressource (zum Beispiel jedes Mal, wenn Sie ein Programm ausführen, einfach ein leeres Formular anzeigt, wie viele Threads sehen Sie unter Task-Manager sehen).

So für Ihren Fall, Sie Threads den tatsächlichen Upload tun müssen, um signalisieren zurück, wenn sie abgeschlossen haben, wenn sie es versäumt haben (und was der Fehler war). Der Controller muss in der Lage sein, mit denen zu beschäftigen und dem Start / Stopp-Prozesse verwalten und so weiter.

Schließlich (fast) unter der Annahme, dass etwas Multi-Thread-Performance machen erhöhen hält nicht immer wahr. Wenn Sie zum Beispiel eine Datei in Segmente schneiden, aber es hat über eine niedrige Geschwindigkeitsverbindung (ADSL sagen) zu reisen, werden Sie durch äußere Kräfte gezwungen und keine Menge Tricks von Einfädeln geht um das zu bekommen. Das gleiche gilt für Datenbank-Updates anwenden kann, Web-Anfragen, etwas invloving große Mengen an Platten-I / O und so weiter.

Trotz allem, ich bin nicht der Prophet des Schicksals. Die Referenzen sind hier mehr als ausreichend, Ihnen zu helfen zu erreichen, was Sie wollen, aber beachten Sie, dass einer der Gründe, Threading scheint kompliziert ist, weil es sein kann:)

Wenn Sie mehr Kontrolle als die Background / Thread wollen, wollen aber nicht alles selbst tun gibt es mindestens zwei sehr gute Freebie Threading-Bibliotheken Klopfen rund um den Ort (Wintellect & PowerThreading)

Prost

Simon

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top