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列中提取数据进行处理,然后另外一个线程处理第二列就行了,这样两个线程读取和写入的不是相同的成员,相互没有影响,也不需要锁。
但是如果你嫌两个线程慢了要用比较多的线程数量,这就必须要锁了,要保证每列读取和写入的时候只有一个线程在操作,不然会出错
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。
其他相似内容:
-
关于VB.net中的验证控件
小弟正在开发一个C/S结构程序,有几个界面有较多的textbox,是关于用户数据输入的,现在想做验证,听说有验证控...
-
多表查询问题
我有三个表,一个表为基本表,一个是代码表,一个是出差表
表一 编号,姓名 ,职别
001 李三 101
...
-
DATAGRIDVIEW无法删除未提交的新行?
再DATAGRIDVIEW录入时,想删除最后自动新增的一行,提示无法删除未提交的新行
Private Sub Dat...
-
迷茫了几天,求各位高手指教一下!下面是我的代码!
<!--#include file="webconfig.asp"-->
<%
Dim SortID
SortID=Trim(FLib.SafeSql(R...
-
vb.net 断开和连接网络连接 修改代码
在vb.net中实现断开和连接网络连接的代码,我在网上找了一段代码
Option Explicit On
'首...
-
DataGridView直接导出EXCEL
如何直接读取DataGridView中的数据,并导出成Excel可以直接读取的文件
记住,我不要通过DataTable。
希...
-
求教:如何在vb.net下做一些好看的界面,整一些好看的效果,改变控件,让控件变得好看点?
有没有点例子?有没有点直接可以做控件的软件?
---...
-
在VB中,对SQL数据库进行增删改语句怎么写呢?
小弟做课程设计,遇到了一点小麻烦,卡在了这里,不知道在VB中怎么写对SQL数据库的增删改...
-
文本框中的数字精确到小数点后两位
请问如何让文本框输入数字后精确到小数点后两位,如:当输入112时,显示为112.00
------解决方案--...
-
VB.NET2008如何利用SendMessage修改按钮的Text?
为了测试 Windows API ,试图点Button用SendMessage修改该按钮的Text,竟然没成功,请教...