一些线程问题

时间:2014-07-06 20:19:04

标签: c# multithreading task

假设我有一个这样的程序:

class Program {
    static void Main() {
        new Task(() => {
            NewClass class = new NewClass();
        }).Start();
    }
}

class NewClass {
    public NewClass() {
        new Task(() => {
            someMethod();
        }).Start();
    }

    public void someMethod() {/* Do stuff */}
}

创建新对象class后第一个thrad会退出还是会继续运行?

如果删除了对象(class = null),第二个线程会被取消吗?

3 个答案:

答案 0 :(得分:2)

嗯..您的任务将很快完成,具体取决于您在someMethod()中的实现。我们假设它是Thead.Delay(),延迟很大。

任务将在您的Main方法结束时结束 - 所以很快。添加一个Console.ReadKey()来解决这个问题。

如果您不再在系统中的任何位置引用NewClass对象,它最终将被Garbage Collected,但这与Task无关。如果任务引用该对象,它将保留在内存中。换句话说 - 你不能删除它。

另外,Task!= Thread。如果您创建了100个任务,那么很可能最终不会有100个线程。

答案 1 :(得分:1)

  

创建新对象类后第一个thrad会退出还是会继续运行?

谁知道呢。任务不是线程。任务结束,但线程可能会根据任务调度程序选择另一个任务。

  

如果删除对象(class = null)

根本不删除对象。对象仍在那里。无法删除C#中的对象 - 留给GC。

答案 2 :(得分:1)

  

创建新对象类后第一个thrad会退出还是会继续运行?

任务使用的线程来自线程池。任务完成后,线程将返回到线程池以执行其他工作。

  

如果删除了对象(class = null),第二个线程会被取消吗?

不,它对第二个帖子没有影响。将变量设置为null不会“删除”对象...它只是删除对它的引用。

相关问题