专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > VB Dotnet

VB.NET多线程操作ListView解决办法

发布时间:2011-06-23 14:58:34 文章来源:www.iduyao.cn 采编人员:星星草
VB.NET多线程操作ListView
列表中有99条数据,我准备建立99个线程分别来处理每一行数据,比如每个线程单独读取指定行的1、2列数据,最后将处理完的数据写入3、4列,线程超过一分钟未返回就退出,请各位提供一些思路吧!刚接触多线程,所以一些概念不了解,大家可以提供一些学习方向,我再去摸索,如果能提供源码参考更好啦!

现在我已经做了一个线程,但是很不稳定,比如 我怎样确切的告诉第2个线程去处理列表第2行的数据?(因为线程不能传参数)
不知道线程能不能自己获取到自己是新线程中的第几个?


------解决方案--------------------
多线程比较复杂哦。要注意公用资源问题哦。有必要要资源同步,或者锁住。
多线程可以带参数的。
------解决方案--------------------
建议先从BackgroundWorker控件入手,这个控件已经封装了同步访问界面线程的机制。

新建一个窗口,并替换下列代码到窗口可运行。

Public Class Form1
Dim WithEvents worker As New System.ComponentModel.BackgroundWorker

Private Sub worker_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles worker.DoWork
'在这里运行你需要大量时间处理的任务
'这个过程中不能访问任何界面控件!否则就会出现死锁或其他不确定的状态
Dim c As Integer = 0
While (worker.CancellationPending = False)
System.Threading.Thread.Sleep(1000) '这里使用线程暂停模拟大量时间损耗
c += 1
worker.ReportProgress(0, c) '通知界面,你已经有新的数据状态需要更新
End While
End Sub

Private Sub worker_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles worker.ProgressChanged
Me.Text = "线程返回的数据是:" + e.UserState.ToString() '在这里将你线程的状态数据显示到界面
'在这里你可以直接访问任意界面控件
End Sub

Public Sub New()

' 此调用是设计器所必需的。
InitializeComponent()
Me.Width = 500
Me.Height = 50
' 在 InitializeComponent() 调用之后添加任何初始化。
worker.WorkerReportsProgress = True
worker.WorkerSupportsCancellation = True
worker.RunWorkerAsync()
End Sub

Private Sub Form4_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
worker.CancelAsync()
End Sub
End Class
------解决方案--------------------
多线程这样处理不合适的,多线程最好是处理不相干的东西,像你这个多线程处理同一个控件,非常容易出问题的,如果用锁的话,多线程也不见得多快。
如果你的这个,读取1、2列数据进行处理,这个处理的时间比较短,就建议你不要用多线程,如果处理的时间比较长,用异步填充的方式将数据填入列表,而且建议你不要用99个线程这么多了。
我先说下单个线程的处理过程:
1.读取列表第1列第i个数据(i用来记数)
2.判断数据是不是有效,如果无效或者为空就退出。
3.处理数据
4.用异步调用的方式将数据填充进列表的3列i行。
5.i=+1循环到步骤1
这样的话这个线程就自动的不停的从列表第1列中提取数据进行处理,然后另外一个线程处理第二列就行了,这样两个线程读取和写入的不是相同的成员,相互没有影响,也不需要锁。
但是如果你嫌两个线程慢了要用比较多的线程数量,这就必须要锁了,要保证每列读取和写入的时候只有一个线程在操作,不然会出错
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: