Domanda

Sto cercando di creare una struttura di importazione di testo multi-thread (generalmente CSV in SQL Server 2005) e vorrei farlo in VB.NET ma non sono contrario a C#.Ho la versione di prova di VS 2008 e non so da dove cominciare.Qualcuno può indicarmi dove posso guardare e giocare con la fonte di a MOLTO semplice applicazione multi-thread per VS 2008?

Grazie!

È stato utile?

Soluzione

Il referenziato DevX l'articolo è del 2001 e .Net Framework 1.1, ma oggi .Net Framework 2.0 fornisce il BackgroundWorker classe.Questa è la classe di threading consigliata se l'applicazione include un componente dell'interfaccia utente in primo piano.

Da Thread MSDN e threading:

Se è necessario eseguire thread di sfondo che interagiscono con l'interfaccia utente, la versione 2.0 .NET Framework fornisce un componente di lavoro in background che comunica usando eventi, con marsameratore incrociato al thread dell'interfaccia utente.

Questo esempio da Classe BackgroundWorker MSDN mostra un'attività in background, una percentuale di avanzamento e un'opzione di annullamento.(L'esempio è più lungo dell'esempio DevX, ma ha molte più funzionalità.)

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

Altri suggerimenti

Questo è un grande articolo:

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

In particolare:

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

Il miglior documento di threading che abbia mai trovato è stato questo http://www.albahari.com/threading/

Se posso permettermi, il problema con gli esempi semplici è che spesso sono troppo semplici.Una volta superato il conteggio o l'ordinamento nelle demo in background, in genere è necessario aggiornare l'interfaccia utente o simili e ci sono alcuni trucchi.Allo stesso modo raramente devi affrontare il conflitto delle risorse in esempi semplici e il fatto che i thread si degradino con garbo quando una risorsa non è disponibile (come una connessione Db) richiede riflessione.

Concettualmente devi decidere come distribuire il tuo lavoro tra i thread e quanti ne vuoi.C'è un sovraccarico associato alla gestione dei thread e alcuni meccanismi utilizzano un pool di thread condiviso che potrebbe essere soggetto a conflitti di risorse (ad esempio, ogni volta che esegui un programma che visualizza semplicemente un modulo vuoto, quanti thread vedi nel task manager).

Quindi, nel tuo caso, i thread che eseguono il caricamento effettivo devono segnalare se sono stati completati, se hanno fallito (e quale è stato l'errore).Il titolare del trattamento deve essere in grado di affrontarli e gestire i processi di avvio/arresto e così via.

Infine (quasi), supporre che creare qualcosa di multithread aumenterà le prestazioni non è sempre vero.Se, ad esempio, dividi un file in segmenti ma deve viaggiare attraverso un collegamento a bassa velocità (ad esempio ADSL), sei vincolato da forze esterne e nessun trucco di threading riuscirà ad aggirare il problema.Lo stesso può valere per aggiornamenti di database, richieste Web, qualsiasi cosa coinvolga grandi quantità di i/o su disco e così via.

Nonostante tutto questo, non sono il profeta di sventura.I riferimenti qui sono più che adeguati per aiutarti a ottenere ciò che desideri, ma tieni presente che uno dei motivi per cui il threading sembra complicato è perché può esserlo :)

Se vuoi più controllo rispetto a BackgroundWorker/Threadpool ma non vuoi fare tutto da solo, ci sono almeno due ottime librerie di threading gratuite in giro (Wintellect e PowerThreading)

Saluti

Simone

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top