首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

基础知识不结实,有段代码难以理解,求解

2013-12-15 
基础知识不扎实,有段代码难以理解,求解using Systemusing System.Collections.Genericusing System.Linq

基础知识不扎实,有段代码难以理解,求解


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace staticTest
{
    class Program
    {
        public static List<string> StrList;
        static void Main(string[] args)
        {
            StrList = new List<string>();
            ThreadPool.QueueUserWorkItem(new WaitCallback(ReadStr));

            while (true)
            {
                StrList = new List<string>();
                var length = Int32.Parse(Console.ReadLine());
                for (int i = 0; i < length; i++)
                {
                    StrList.Add(i.ToString());
                }
                Console.WriteLine("初始化{0}个元素", StrList.Count);
            }
        }

        static void ReadStr(object args)
        {
            var rds = new ReadStrList(StrList);
            while (true)
            {
                rds.Read();
                Thread.Sleep(5000);
            }
        }

        public class ReadStrList
        {
            List<string> _StrList;
            public ReadStrList(List<string> strList)
            {
                this._StrList = strList;
            }

            public void Read()
            {
                Console.WriteLine("StrList中有{0}个元素", _StrList.Count);
            }
        }
    }
}



以上代码,当执行 StrList = new List<string>() 后,为什么ReadStrList类中的Read读取到的个数没有变化,_StrList 是个引用类型,按道理是随着 StrList 变化才对呀?
[解决办法]
上面也有StrList = new List<string>(); 是不是重复了?
[解决办法]
可能是你有一个线程在执行了ReadStr,一直在那个while(true)循环中,他当然没有元素了。。
[解决办法]
主要是线程池后面又给StrList重新分配了地址。导致main中(主线程中)的StrList指向的地址和ReadStr中(子线程中)的_StrList的指向的地址不一致。
如果你通过

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
 
namespace staticTest
{
    class Program
    {
        public static List<string> StrList;


        static void Main(string[] args)
        {
            StrList = new List<string>();
            ThreadPool.QueueUserWorkItem(new WaitCallback(ReadStr));
 
            while (true)
            {
                //这里重新分配了地址
                StrList = new List<string>();
                var length = Int32.Parse(Console.ReadLine());
                for (int i = 0; i < length; i++)
                {
                    StrList.Add(i.ToString());
                }
                Console.WriteLine("初始化{0}个元素", StrList.Count);
            }
        }
 
        static void ReadStr(object args)
        {
            //如果这里加入延时,保证下面的语句在第二次new List<string>()之后执行,
            //那么读取到的个数也会跟着变化
            //Thread.Sleep(5000);
            var rds = new ReadStrList(StrList);
            while (true)
            {
                rds.Read();
                Thread.Sleep(5000);
            }
        }
 
        public class ReadStrList
        {
            List<string> _StrList;
            public ReadStrList(List<string> strList)
            {
                this._StrList = strList;
            }
 
            public void Read()
            {
                Console.WriteLine("StrList中有{0}个元素", _StrList.Count);
            }
        }
    }
}



[解决办法]
引用:
Quote: 引用:

简单的说,
A = new List<string>();
B = A;
A = new List<string>();
这时A换新的了,B还是旧的, AB指的就不一是同一个了。


明白了。那如何做才能让 A = new List<string>()后 b自动引用到他的新地址?

这是不行的,要一直用A才可以。

在ReadStr(object args)里不要自己定义新变量,要一直用回StrList。

 static void ReadStr(object args)
        {
            while (true)
            {
                Console.WriteLine("StrList中有{0}个元素", StrList.Count);
                Thread.Sleep(5000);
            }
        }




热点排行