VB.Net(或者C#)2008多线程导入
我正在寻求构建多线程文本导入工具(通常将CSV导入SQL Server 2005),并希望在VB.NET中做到这一点,但我并不反对C#。我有VS 2008试用版,只是不知道从哪里开始。谁能指出我的方向,让我可以查看和使用VS 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
引用的DevX文章来自2001和.Net Framework 1.1,但是今天.Net Framework 2.0提供了BackgroundWorker类。如果应用程序包括前台UI组件,则这是推荐的线程类。
从MSDN线程和线程:
If you need to run background threads that interact with the user interface, the .NET Framework version 2.0 provides a BackgroundWorker component that communicates using events, with cross-thread marshaling to the user-interface thread.
MSDN BackgroundWorker类中的此示例显示了后台任务,进度%和cancel选项。 (该示例比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.albahari.com/threading/
如果可以的话,简单示例的问题在于它们通常太简单了。一旦超过计数或者在后台演示中进行排序,则通常需要更新UI或者类似内容,并且有些陷阱。同样,我们很少需要在简单的示例中处理资源争用,并且在资源不可用(例如Db连接)时,线程会优雅地降级。
从概念上讲,我们需要确定如何在线程之间分配工作以及需要多少工作。与管理线程相关的开销很大,某些机制使用的共享线程池本身可能会受到资源争用的影响(例如,每当我们运行一个仅显示空表格的程序时,在任务管理器下就会看到多少个线程)。
因此,对于情况,执行实际上载的线程需要发信号通知它们是否已完成,是否失败(以及失败的原因)。控制器需要能够处理这些问题并管理启动/停止过程等。
最后(几乎),假设创建多线程可以提高性能并不总是成立。例如,如果我们将文件切成段,但必须通过低速链接传输(ADSL说),那么我们将受到外力的束缚,并且没有任何解决方法。这同样适用于数据库更新,Web请求,任何涉及大量磁盘I / O的事情等等。
尽管如此,我不是厄运的先知。这里的参考足以实现所需的目标,但是请注意,线程看起来很复杂的原因之一是因为它可能是:)
如果我们想要比BackgroundWorker / Threadpool更好的控制权,但又不想自己做任何事情,那么至少有两个非常不错的免费赠品线程库在附近(Wintellect和PowerThreading)
干杯
西蒙