Pergunta

Eu estou olhando para construir uma instalação de importação de texto de multi-threaded (geralmente CSV em SQL Server 2005) e gostaria de fazer isso em VB.NET, mas eu não sou contra o C #. Eu tenho VS 2008 tentativa e só sei não faça por onde começar. Pode apontar ninguém me na direção de onde eu possa olhar e jogar com a fonte de um muito aplicação multi-threaded simples para VS 2008?

Obrigado!

Foi útil?

Solução

O referenciada DevX artigo é de 2001 e .NET Framework 1.1, mas hoje .Net Framework 2.0 fornece o BackgroundWorker classe. Esta é a classe de threading recomendado se o seu aplicativo inclui um componente plano UI.

A partir MSDN Threads e rosqueamento :

Se você precisa executar threads em segundo plano que interagem com a interface do usuário, a versão 2.0 Framework fornece um componente BackgroundWorker que se comunica usando eventos, com entre segmentos de empacotamento para o segmento de interface do usuário.

Este exemplo de MSDN BackgroundWorker Classe uma tarefa de fundo, progredir%, e cancelar a opção. (O exemplo é mais longa do que a amostra DevX, mas tem muito mais funcionalidades.)

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

Outras dicas

Este é um ótimo artigo:

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

Em particular:

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

Sobre o melhor documento de threading que eu já encontrei foi esta http://www.albahari.com/threading/

Se me permite, o problema com exemplos simples é que que eles são muitas vezes demasiado simples. Depois de ter passado a contagem ou classificar em demos fundo você geralmente precisa atualizar a interface do usuário ou similar e há algumas armadilhas. Da mesma forma que você raramente tem que lidar com a contenção de recursos em exemplos simples e com tópicos degradar normalmente quando um recurso não está disponível (como uma conexão Db) exige reflexão.

Conceitualmente, você precisa decidir como você está indo para distribuir seu trabalho através dos tópicos e quantos você quiser. Há sobrecarga associada ao gerenciamento de threads e alguns mecanismos de usar um pool de threads compartilhado que poderia estar sujeito a si contenção de recursos (por exemplo, quando você executar um programa que simplesmente exibe uma forma vazia, quantos threads você vê sob o gerenciador de tarefas).

Assim, para o seu caso, você tópicos fazendo a necessidade de upload real para sinalizar de volta se eles já concluídos, se eles falharam (e que o fracasso era). As necessidades de controlador para ser capaz de lidar com aqueles e gerenciar os processos / Stop Start e assim por diante.

Finalmente (quase), assumindo que fazer algo multithread vai aumentar o desempenho nem sempre são verdadeiras. Se, por exemplo, você cortar um arquivo em segmentos, mas tem que viajar através de um link de baixa velocidade (digamos ADSL), você está limitado por forças externas e nenhuma quantidade de enfiar trapaça vai ficar em torno disso. O mesmo pode aplicar-se para atualizações de dados, solicitações da web, qualquer coisa invloving grandes quantidades de disco I / O e assim por diante.

Apesar de tudo isso, eu não sou o profeta da desgraça. As referências aqui são mais que suficientes para ajudá-lo a conseguir o que você quer, mas esteja ciente de que uma das razões de threading parece complicado é porque ele pode ser:)

Se você não quer mais controle do que o BackgroundWorker / ThreadPool mas quero fazer tudo sozinho, há pelo menos duas boas bibliotecas brinde de threading batendo em torno do lugar (Wintellect & PowerThreading)

Felicidades

Simon

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top