[VB.NET]多线程操作的问题

VB.NET源码-156个实用实例哦…… <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
多线程操作的问题
我做了一个定时程序,用Timer定时,一到设定的时间,就新建一个线程,并在线程中向数据库导入数据。
因为有多个数据库,而且定时的时间都不一样,所以会同时运行多个线程。
现在问题是,线程有ThreadStart和Thread两种,请问有什么区别?
用ThreadStart新建的线程,然后用MethodInvoke运行,可以正常的将信息写到窗体上,但是如果用Thread新建线程,然后用Start运行,则要么报错要么不现实信息?
第二个问题是,我如何判断我创建的线程是否完成了呢,然后清除线程的代码应该写在哪里呢?是线程内部,还是新建线程的地方,还是需要新建一个线程监控呢?
希望大侠给予指点!
__________________________________________________________________________
你可以写一个运行线程的类,类里面包括运行线程,关闭线程,线程完成后返回值。
当你要运行一个任务的时候就实例化一次这个类,你只需要调用这个实例化的类就OK了。
__________________________________________________________________________
能不能给个例子啊
不是很明白怎么操作
还有新建的ThreadStart线程需要用nothing释放掉吗
__________________________________________________________________________
关于--------- Thread新建线程,然后用Start运行,则要么报错要么不现实信息?
在窗体 load 时间 加入 Control.CheckForIllegalCrossThreadCalls = False 差不多是这里的问题

不过 这种方法,被人评为 不太安全。


另外 问一下 lz 是怎么用

用ThreadStart新建的线程,然后用MethodInvoke运行?
__________________________________________________________________________
判断线程的.isalive属性,可知道线程是否活动,
好像还有一个是.threadstaute可以知道线程状态.
__________________________________________________________________________
不是一直运行的线程,最好不要手工创建,因为创建线程和终止线程需要比较多的资源。最好用“线程池”,因为“线程池”是可以重复使用的,应该是大多数多线程情形中的首选。使用线程池可以用以下几个途径:BackgroudWorker控件、调用异步方法、使用委托、用System.Timers.Timer控件(注意,此Timer非彼Timer控件)、手动调用ThreadPool.QueueUserWorkItem方法.
对于数据库,你可以使用异步方法(Begin..... End......方法),这些方法是在后台执行的,操作完成后,程序会执行回调方法。用这个的好处是不需要创建线程,不需要终止线程,一切都在线程池中完成,操作完后,下次还可以重用。
__________________________________________________________________________
一般情况下Thread thread = new Thread(new ThreadStart(yourFunction));
thread.start();
__________________________________________________________________________
cuo_cool(CuO)大哥,你说的线程池我还不是很明白,能不能给我个例子,谢谢
__________________________________________________________________________
MSDN是最好的老师,呵呵,里面有很多例子。我不是很明白你的意思,你要实现什么样的功能?
我不明白为什么要定时保存,而不是达到一定数量再保存?
__________________________________________________________________________
因为这是个收费系统,做了一个CUBE进行数据分析,收费系统的数据库在Oracle上,分析系统的数据库在Sql上,比如每天晚上8点将数据从Oracle上导出到Sql上,是增量导出的,用Etl实现。
我现在是用Timer定时,时间一到就启动一个线程,线程的任务就是运行一个DTSX包。
现在还有一个问题,为什么线程运行以后,程序的主窗口还是不能更新,就像没有使用线程一样?
是不是因为SSIS服务只能由一个对象使用?
__________________________________________________________________________
还有,如何才能监视一个变量是否改变,如果改变的话就执行一段过程,这个应该怎么写啊
__________________________________________________________________________
高深!
“还有,如何才能监视一个变量是否改变,如果改变的话就执行一段过程,这个应该怎么写啊”自定义事件吧,
不是主线程(窗体)的代码要改变主窗体的控件时,不能直接调用,要用委托
Friend Delegate Sub AddToTxtLogDelegate(ByVal strLog As String)
Friend Sub AddToLogger(ByVal strLog As String)
If Me.InvokeRequired = False Then
With frmLogger.txtLog
.AppendText(strLog)
End With
Else
Me.Invoke(New AddToTxtLogDelegate(AddressOf AddToLogger), strLog)
End If
End Sub
以上的代码可以在别的线程将字符串写到窗体的TextBox中,如果你要更新的话,估计也应该执行类似的操作。
__________________________________________________________________________
大虾,顺便看一下我的问题
http://community.csdn.net/Expert/topic/5462/5462537.xml?temp=.1638147
__________________________________________________________________________
cuo_cool(CuO),你可能没看懂我的意思,我不是无法将线程上的信息反馈到主界面上,而是在线程运行时,主界面就是一片白的,根本无法操作,就像没有用线程一样!
__________________________________________________________________________
我自己程序里面的一个线程操作的类,你参考下了。

Imports System
Imports System.Threading

Public Class cls_Thread
自定义线程结构类型
Private Structure udtThread
Dim Handle As Thread
Dim Enabled As Boolean
End Structure

Private meTheard As udtThread

初始化线程
Public Sub Initialize(ByVal LongPointFunction As Integer)
Dim myThreadStart As ThreadStart

On Error Resume Next
Select Case LongPointFunction
Case 0
myThreadStart = New ThreadStart(AddressOf RunURL0)
Case 1
myThreadStart = New ThreadStart(AddressOf RunURL1)
Case 2
myThreadStart = New ThreadStart(AddressOf RunURL2)
Case 3
myThreadStart = New ThreadStart(AddressOf RunURL3)
Case 4
myThreadStart = New ThreadStart(AddressOf RunURL4)
End Select

myThreadStart = New ThreadStart(AddressOf RunURL0)
meTheard.Handle = New Thread(myThreadStart)

End Sub

Public Property ThreadEnabled() As Boolean
获取线程是否激活属性
Get
ThreadEnabled = meTheard.Enabled
End Get
设置线程是否激活属性
Set(ByVal value As Boolean)
若激活线程(Newvalue为真)设为TRUE且此线程原来没有激活时激活此线程
If value And (Not meTheard.Enabled) Then

meTheard.Handle.Start()

meTheard.Enabled = True

End If

End Set
End Property

终止线程事件

Protected Overrides Sub Finalize()
On Error Resume Next
meTheard.Handle.Abort()
MyBase.Finalize()
End Sub

End Class
__________________________________________________________________________
主线程被阻塞了?呵,后台太忙了,你用VB2003还是2005啊?
__________________________________________________________________________
不要让某个线程执行死循环嘛,操作完了之后,阻塞它,等下次执行再重新恢复。
Dim Done as New ManualResetEvent(false)
你查一下ManualResetEvent的用法.
能否看一下你某个线程的一部分代码?不要太长
__________________________________________________________________________
Public Sub DTSPackageExecute()
新建应用程序实例
Dim appDts As New Application
新建DTS包实例
Dim dts As Package = appDts.LoadPackage(m_DTSPackagePath, Nothing)
如果CommandString不为Nothing时输入命令字符串
If m_CommandString IsNot Nothing Then
新建DTS包变量
Dim dtsVariable As Variables = dts.Variables
dtsVariable( 用户::cmStr ).Value = m_CommandString
End If
运行DTS包,并返回运行结果
If dts.Execute = DTSExecResult.Success Then

Else

End If
释放对象
appDts = Nothing
End Sub
这个就是线程内部最主要的代码,用来运行DTS包文件的,我也没有用死循环啊,可是就是主进程好像不动作了!有什么办法可以解决吗
__________________________________________________________________________
只要线程运行的代码执行完了,线程就会自动关闭,
可以IsAlive是标识线程是否正在运行

Abort方法是用来终止线程的,这个方法会在线程内部产生异常

至于更新界面显示,一般需要使用对象.Invoke方法,来更新,否者会出现问题
__________________________________________________________________________
执行完代码了,线程没有终止的,不信你用任务管理器看一下线程数,也可用看一下线程的状态属性,或者你再Start启动一次,马上出现异常。要用ABORT或者用Nothing,但是ABORT方法会产生异常。
没有死循环就奇怪了,难道一直在执行什么东西?而不是像你说的那样,到了一定时间才执行?
我倒是遇到过窗体不能刷新的情况,但是那是因为我的程序里某个线程一直在执行,
__________________________________________________________________________
那如果线程一直在执行的话,如何才能让窗体不受到线程的影响呢?
主要是我的定时器不能停止,否则其他任务就无法定时了
__________________________________________________________________________
数据量大的话,最好是后台处理,不要在窗体上面处理繁重的任务,不然窗体很难刷新的
__________________________________________________________________________
我觉得应该是定时去启动线程,而不是在另一个线程里面等待时间
__________________________________________________________________________
是呀,我是定时启动一个线程啊
就是线程在运行的时候无法刷新程序界面啊

还有,如何后台处理呢
__________________________________________________________________________
数据量大的话,不要跟控件打交道,这样主线程就不忙了。如果一定要在控件上显示的话,那我就不知道了,具体问题具体分析吧。
Dim th as Thread

时间到了,我要处理了
th=new Thread(AddressOf task1)
th.Start()

Private sub task1()
处理数据
th=Nothing 注意,如果没有这个的话(或者Abort),线程就会越来越多,每执行一次,线程数加1最后可想而知了,可以从任务管理器看到。如果程序能执行到这里,说明没有死循环,这个线程会被释放,窗体也不会不能刷新。如果以非常快的速度更新列表控件的话,窗体也很难刷新的,不知道你是不是这种情况
End Sub
__________________________________________________________________________
Th=nothing放在线程里面
线程可以自己结束自己吗
或者我吧线程的优先级设置的低点有用吗
__________________________________________________________________________
是的,是放在线程执行的方法里面,
__________________________________________________________________________
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值