VB.Net (или C #) 2008 Многопоточный импорт - PullRequest
2 голосов
/ 18 сентября 2008

Я хочу создать средство многопоточного импорта текста (обычно CSV в SQL Server 2005) и хотел бы сделать это в VB.NET, но я не против C #. У меня есть пробная версия VS 2008, и я просто не знаю, с чего начать. Кто-нибудь может указать мне, где я могу посмотреть и поиграть с источником ОЧЕНЬ простого многопоточного приложения для VS 2008?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 18 сентября 2008

Это отличная статья:

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

В частности:

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
2 голосов
/ 04 февраля 2009

Ссылочная статья DevX относится к 2001 году и .Net Framework 1.1, но сегодня .Net Framework 2.0 предоставляет класс BackgroundWorker . Это рекомендуемый класс потоков, если ваше приложение включает компонент пользовательского интерфейса переднего плана.

От Потоки и потоки MSDN :

Если вам нужно запустить фоновые потоки которые взаимодействуют с пользовательским интерфейсом, .NET Framework версия 2.0 предоставляет компонент BackgroundWorker который общается с помощью событий, с поперечный маршалинг к Поток пользовательского интерфейса.

Этот пример из MSDN BackgroundWorker Class показывает фоновую задачу,% выполнения и опцию отмены. (Этот пример длиннее, чем образец DevX, но обладает гораздо большей функциональностью.)

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
1 голос
/ 14 августа 2009

Лучшим документом о потоке, который я когда-либо нашел, был этот http://www.albahari.com/threading/

Если можно, проблема простых примеров в том, что они часто слишком просты. Как только вы закончите подсчет или сортировку в фоновых демонстрациях, вам, как правило, нужно обновить пользовательский интерфейс или аналогичный, и есть некоторые ошибки. Точно так же вам редко приходится сталкиваться с конфликтом ресурсов в простых примерах, и для того, чтобы потоки изящно ухудшались, когда ресурс недоступен (например, соединение Db), нужно подумать.

Концептуально вам нужно решить, как вы собираетесь распределять свою работу по потокам и сколько вы хотите. С управлением потоками связаны накладные расходы, и некоторые механизмы используют общий пул потоков, который может быть подвержен самому конфликту ресурсов (например, каждый раз, когда вы запускаете программу, которая просто отображает пустую форму, сколько потоков вы видите в диспетчере задач).

Таким образом, для вашего случая вы, потоки, выполняющие фактическую загрузку, должны сообщить, если они завершили, если они потерпели неудачу (и что это был за сбой). Контроллер должен иметь возможность справляться с ними и управлять процессами запуска / остановки и т. Д.

Наконец (почти), если предположить, что создание многопоточности увеличит производительность, это не всегда верно. Например, если вы разбили файл на сегменты, но он должен проходить по низкоскоростному каналу (скажем, ADSL), вы ограничены внешними силами, и никакие хитрости потоков не обойдут его. То же самое можно применить к обновлениям базы данных, веб-запросам, всему, что связано с большим количеством операций ввода-вывода и т. Д.

Несмотря на все это, я не пророк гибели. Ссылки здесь более чем достаточны, чтобы помочь вам достичь того, чего вы хотите, но имейте в виду, что одна из причин, по которой многопоточность кажется сложной, заключается в том, что она может быть:)

Если вам нужен больший контроль, чем у BackgroundWorker / Threadpool, но вы не хотите делать все сами, есть как минимум две очень хорошие библиотеки потоков халявы, разбросанные по всему месту (Wintellect & PowerThreading)

Приветствия

Simon

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...