Вопрос

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

Спасибо!

Это было полезно?

Решение

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

От Потоки MSDN и многопоточность:

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

Этот пример из Класс BackgroundWorker MSDN BackgroundWorker показывает фоновую задачу, процент выполнения и опцию отмены.(Этот пример длиннее, чем образец 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

Другие советы

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

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

Пожалуй, лучшим документом о потоках, который я когда-либо находил, был следующий http://www.albahari.com/threading/

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

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

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

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

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

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

Ваше здоровье

Саймон

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top