Importazione multithread VB.Net (o C#) 2008
-
01-07-2019 - |
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!
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.
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