VB.Net(或C#)2008多线程导入[英] VB.Net (or C#) 2008 Multi Threaded Import

问题描述

我希望构建一个多线程文本导入设施(通常为SQL Server 2005中的CSV),并希望在vb.net中这样做,但我不反对C#.我有VS 2008审判,只是不知道从哪里开始.谁能向我指向我可以查看和使用A 非常简单的多线程应用程序的方向,vs 2008?

谢谢!

推荐答案

引用的 devx 文章来自2001和.NET Framework 1.1,但是今天.NET Framework 2.0提供 BackownWorker 类.如果您的应用程序包括前景UI组件,这是推荐的线程类.

来自 msdn线程和线程:

如果您需要运行背景线程 与用户界面相互作用, .NET框架版本2.0 提供背景工作者组件 使用事件与 跨线程 用户界面线程.

此示例来自 msdn countergworker classcter class 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

其他推荐答案

这是一篇很棒的文章:

http://www.devx.com/devx.com/devx.com/devx/10minutestolution/10minutestolution/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/螺纹/

如果我可以,简单示例的问题是它们通常太简单了.经过计数或在后台演示中进行排序,您通常需要更新UI或类似内容,并且有一些陷阱.同样,您很少在简单的示例中处理资源争夺,并且在不可用资源(例如DB连接)时,线程优雅地降级.

从概念上讲,您需要决定如何在线程中分发工作以及想要多少.有与管理线程相关的开销,某些机制使用共享线程池,该池本身可能受到资源争夺本身的影响(例如,每当您运行一个简单地显示空形式的程序时,您在任务管理器下看到了多少个线程).

因此,对于您的情况,您进行实际上传的线程需要发出信号,如果他们已经失败(失败是什么).控制器需要能够处理这些并管理开始/停止过程等.

最终(几乎),假设制作多线程会提高性能并不总是成立的.例如,如果您将文件切成段,但必须跨越低速链接(ADSL说),那么您会受到外部力量的约束,并且没有任何螺纹骗局可以解决.同样的数据库更新,Web请求,任何吸引大量磁盘I/O等的内容.

尽管如此,我不是厄运的先知.这里的参考文献足以帮助您实现想要的目标,但要注意线程似乎复杂的原因之一是因为它可以是:)

如果您想要比背景工作人员/ThreadPool更多的控制权,但不想自己做所有事情,那么至少有两个非常好的免费赠品线程库在该地点(Wintellect&PowerThreading)敲门(Wintellect&PowerThreading)

欢呼

西蒙

本文地址:https://www.itbaoku.cn/post/902520.html