在写一个小程序的时候碰到几个关于线程的问题,想了很久没弄明白。程序中需要一个后台线程一直运行监视,所以做一个子线程。子线程需要在主线程上实时显示监视情况,也就是实时向主线程的datagridview控件中添加数据并显示。此时使用线程时碰到几个问题。
1.ThreadStart委托的位置问题。为什么把ThreadStart委托的声明写在方法里面的时候可以使用方法名做参数,而写到方法外面的时候会报错。
2.线程的操作问题。子线程的Start()和其他方法必须在同一个方法内实现么?例如我想在一个button_click()中调用Thread.Start()而在另一个Button2_Click()中调用Thread.Abord(),这样就不行。为什么在其他方法内不能引用子线程实例?
3.线程的状态问题。为什么在调用Thread.Start()后,在主线程中调用子线程的ThreadStatics属性并显示在主线程的label中的时候,会显示unstarted?
4.主线程假死的问题。设置子线程IsBackground=True,子线程通过委托实时更新主线程的datagridview,为什么主线程还是会假死?
这几个问题困扰了我好久,哪位达人熟悉线程帮忙解释一下,不甚感激多线程WinForm

解决方案 »

  1.   

    上面的问题一部分已经解决了,就是线程定义的位置问题。我现在有一件事不明白,就是在主线程中结束子线程的问题,如果在主线程中的一个事件中结束子线程,当点击UI的Button时CurrentThread就是主线程,那么子线程的状态就是UnStarted,那子线程的Suspend()方法就会报错,这种情况何解?
      

  2.   

    先搞清楚线程与线程之间的关系,还有线程是不分主次的。他们的级别都是平等的。
    CurrentThread 说明这个线程已结束,
      

  3.   

    不好意思啊,理解有误,我以为前台UI线程,也就是Application.Run()就是主线程呢!,但是Thread.CurrentThread是指目前正在运行的线程
      

  4.   

    楼主 可以用backgroundWorker类的方法可以实现。问题1 线程的开始是靠委托来实现的,所以可以将方法当作参数来传递问题2 backgroundWorker类可以实现,这是线程通信的相关问题
    问题3 这是线程间通信的问题,你可以搜索一下相关方面的知识,学习一下问题4 可能的原因是你在启动一个子线程的时候,可能将当前的线程阻塞了。所以还会有假死的情况