我希望构建一个多线程文本导入工具(通常是CSV到SQL Server 2005),并希望在VB.NET中这样做,但我不反对C#。我有VS 2008试用版,只是不知道从哪里开始。任何人都可以指出我可以看到的方向并使用VS 2008的非常简单多线程应用程序的来源吗?
谢谢!
答案 0 :(得分:4)
这是一篇很棒的文章:
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
答案 1 :(得分:2)
引用的 DevX 文章来自2001和.Net Framework 1.1,但今天.Net Framework 2.0提供了BackgroundWorker类。如果您的应用程序包含前台UI组件,那么这是推荐的线程类。
如果您需要运行后台线程 与用户界面交互, .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
答案 2 :(得分:1)
关于我发现的最佳线程文档是http://www.albahari.com/threading/
如果可以的话,简单例子的问题在于它们通常太简单了。一旦你通过计数或在背景演示中排序,你通常需要更新UI或类似的,并有一些陷阱。类似地,您很少需要处理简单示例中的资源争用,并且当资源不可用(例如Db连接)时需要考虑线程降级。
从概念上讲,您需要决定如何在线程中分配您的工作以及您想要多少。与管理线程相关的开销和一些机制使用可能受资源争用影响的共享线程池(例如,任何时候运行只显示空表单的程序,您在任务管理器下看到多少个线程)。
因此,对于您的情况,执行实际上传的线程需要在它们完成时发出信号,如果它们已经失败(以及失败是什么)。控制器需要能够处理这些并管理启动/停止过程等。
最后(几乎),假设制作多线程的东西会增加性能并不总是成立。例如,如果你将一个文件分割成段但是它必须通过一个低速链接(ADSL说),你受外部力量的约束,没有多少线程技巧可以解决这个问题。这同样适用于数据库更新,Web请求,任何包含大量磁盘i / o的内容等。
尽管如此,我还不是厄运的先知。这里的引用绰绰有余,可以帮助你实现你想要的,但要注意,线程的一个原因似乎很复杂,因为它可能是:)
如果你想要比BackgroundWorker / Threadpool更多的控制,但又不想自己做所有事情,那么至少有两个非常好的免费线程库可以敲响这个地方(Wintellect& PowerThreading)
干杯
西蒙