首页 新闻 会员 周边

C# 关于在类中创建线程的问题

0
悬赏园豆:5 [已解决问题] 解决于 2017-12-05 17:16

我先创建了一个类,在类中开了2个线程,线程中都是while(true) 死循环 。  当我把类实例化的时候,两个线程就创建并运行了, 这个时候,类被释放掉,这两个线程是继续执行还是也被释放掉?

百鸟朝凤的主页 百鸟朝凤 | 菜鸟二级 | 园豆:260
提问于:2017-11-17 13:30
< >
分享
最佳答案
0

当然继续执行了

收获园豆:5
长蘑菇星人 | 小虾三级 |园豆:1832 | 2017-11-17 13:37

在类中开启的线程,现在这个类完全被释放掉了,那线程怎么会还在执行呢? 是后台线程

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2017-11-17 13:39

@百鸟朝凤: 后台线程,你也没先说啊.就算是后台线程.它也和创建的类没关系.只跟主线程有关.主线程不关就继续.

长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-17 13:41

@长蘑菇星人: 也就说线程在创建之后,就完全脱离类了? 但是我线程还用了类里面的变量,类被释放掉之后,那类中的变量了,如何还在线程中使用?是不是这个时候线程该抛出异常了?

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2017-11-17 13:45

@百鸟朝凤: 不会啊.如果线程中有引用.,那个类就不会被垃圾回收.这时候线程你控制不了,类也不会被回收.可以算是内存泄漏了.

长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-17 13:47

@长蘑菇星人: 那我就是想在类被释放的时候关闭全部这个类中创建的东西,那我能强制回收所有资源不

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2017-11-17 13:51

@百鸟朝凤: 可以啊.释放的时候把线程停了.就都安静了..

长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-17 13:52

@长蘑菇星人: 问题是死循环。。。在类释放的时候是可以触发什么事件么,在这个事件里面停止线程?

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2017-11-17 13:58

@百鸟朝凤: 难道你的释放不是调用Dispose方法么..

bool 线程已死 = false;

void loop(){
     while(!线程已死){
        //干活
    }
}
void Dispose(){
     线程已死 = true;
}
长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-17 14:02

@长蘑菇星人: 我先试试。。。不懂了再问下你0.0

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2017-11-17 14:09
 public class myclass
    {
        int k;

        public myclass(int _k)
        {
            k = _k;
            Thread th = new Thread(xiancheng);
            th.IsBackground = true;
            th.Start();

        }
        private void xiancheng()
        {
            while(true)
            {
                Console.Write(k.ToString());
            }
        }

    }
  private void button1_Click(object sender, EventArgs e)
        {
            myclass my = new myclass(5);
        }

调用之后,线程果然在一直执行,现在我在哪可以释放资源啊。。。实例化的类根本没有dispose 方法

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2017-11-17 14:27

@百鸟朝凤:

 public class myclass
    {
        int k;
        bool 线程已死 = false;
        public myclass(int _k)
        {
            k = _k;
            Thread th = new Thread(xiancheng);
            th.IsBackground = true;
            th.Start();

        }
        private void xiancheng()
        {
            while(!线程已死)
            {
                Console.Write(k.ToString());
            }
        }
       public void Dispose(){
             线程已死 = true;
       }
    }
private void button1_Click(object sender, EventArgs e)
        {
            myclass my = new myclass(5);
            my.Dispose();
        }
长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-17 14:38

@百鸟朝凤: 自己写一个dispose方法啊,释放类的时候调用一下,世界安静了。。

Linner1987 | 园豆:202 (菜鸟二级) | 2017-11-17 14:39

@长蘑菇星人: 哦哦哦,明白了。那这样的话,我在类中所有的变量就都被释放了吧。 我实际项目中的类中包括 socket对象,也会被释放掉吧

百鸟朝凤 | 园豆:260 (菜鸟二级) | 2017-11-17 14:56

@百鸟朝凤: emmmm 不如 你先写出来

长蘑菇星人 | 园豆:1832 (小虾三级) | 2017-11-17 15:04
其他回答(3)
0

while(“是否需要运行”)这样子就可以了。释放类的时候把那个变量改成false

数据酷软件 | 园豆:130 (初学一级) | 2017-11-17 14:19
0

你都background的了,用线程池不是更好?何必给自己添加麻烦?

还有那种加个没任何防御标识标明需不需要退出的,幸好里面有个io操作,要是碰到纯cpu计算那就哭吧。

Daniel Cai | 园豆:10424 (专家六级) | 2017-11-17 16:47
0

 自己测试下就知道了,在线程中加一个全局变量,到时看下变量就知道线程在不在了

jqw2009 | 园豆:2439 (老鸟四级) | 2017-11-17 17:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册