基础知识不扎实,有段代码难以理解,求解
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);
}
}
}
}
[解决办法]
这是不行的,要一直用A才可以。
在ReadStr(object args)里不要自己定义新变量,要一直用回StrList。
static void ReadStr(object args)
{
while (true)
{
Console.WriteLine("StrList中有{0}个元素", StrList.Count);
Thread.Sleep(5000);
}
}