加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 23:41:41 所属栏目:大数据 来源:网络整理
导读:多线程操作的问题 我做了一个定时程序,用Timer定时,一到设定的时间,就新建一个线程,并在线程中向数据库导入数据。 因为有多个数据库,而且定时的时间都不一样,所以会同时运行多个线程。 现在问题是,线程有ThreadStart和Thread两种,请问有什么区别?
多线程操作的问题 我做了一个定时程序,用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放在线程里面 线程可以自己结束自己吗 或者我吧线程的优先级设置的低点有用吗 __________________________________________________________________________ 是的,是放在线程执行的方法里面, __________________________________________________________________________

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读