我希望构建一个多线程文本导入工具(通常是 CSV 到 SQL Server 2005),并希望在 VB.NET 中执行此操作,但我并不反对 C#。我有 VS 2008 试用版,只是不知道从哪里开始。谁能指出我可以在哪里查看和使用源代码的方向 非常 VS 2008 的简单多线程应用程序?

谢谢!

有帮助吗?

解决方案

所引用的 开发X 文章来自 2001 年和 .Net Framework 1.1,但今天 .Net Framework 2.0 提供了 后台工作者 班级。如果您的应用程序包含前台 UI 组件,则这是推荐的线程类。

MSDN 线程和线程:

如果您需要运行与用户界面交互的背景线程,则.NET Framework版本2.0提供了一个背景工作人员组件,该组件使用事件进行通信,并将其交叉读取到用户界面线程。

这个例子来自 MSDN 后台工作者类 显示后台任务、进度 % 和取消选项。(该示例比 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/

如果可以的话,简单示例的问题在于它们通常太简单了。一旦您完成了后台演示中的计数或排序,您通常需要更新 UI 或类似内容,并且存在一些问题。同样,您很少需要在简单的示例中处理资源争用,并且当资源不可用(例如数据库连接)时让线程正常降级需要考虑。

从概念上讲,您需要决定如何在线程之间分配工作以及需要多少个线程。管理线程会产生相关开销,并且某些机制使用共享线程池,而共享线程池本身可能会受到资源争用的影响(例如,每当您运行仅显示空表单的程序时,您会在任务管理器下看到多少个线程)。

因此,对于您的情况,执行实际上传的线程需要返回信号是否已完成、是否失败(以及失败是什么)。控制器需要能够处理这些问题并管理启动/停止过程等。

最后(几乎),假设制作多线程会提高性能并不总是成立。例如,如果您将文件分成多个片段,但它必须通过低速链路(例如 ADSL)传输,您就会受到外力的限制,并且任何线程技巧都无法解决这个问题。同样的情况也适用于数据库更新、Web 请求、任何涉及大量磁盘 I/O 的内容等。

尽管如此,我并不是末日预言家。这里的参考资料足以帮助您实现您想要的目标,但请注意,线程看起来复杂的原因之一是因为它可以是:)

如果您想要比BackgroundWorker/Threadpool更多的控制,但又不想自己做所有事情,那么至少有两个非常好的免费线程库(Wintellect和PowerThreading)

干杯

西蒙

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top